seo vriendelijk met PHP

Door josvane op zondag 3 juni 2012 20:30 - Reacties (16)
Categorie: -, Views: 7.223

SEO vriendelijke URL
Wellicht voor vele bekend, je hebt een hobby en probeert dit steeds groter en vooral beter aan te pakken. Naast dat ik het dus erg leuk vindt om te racefietsen is een van de andere dingen waar ik van kan genieten het bouwen van een CMS.

Doorgaands (eigenlijk altijd) maak ik gebruik van PHP en MySql dit alles wordt af en toe ondersteund door Jquery. Persoonlijk ligt de uitdagingen altijd om een mooi maar vooral functioneel te programmeren. Met mooi bedoel ik dan voornamelijk het design. Naarmate ik meer ben gaan programmeren stijgt ook de drang om de code ook netjes te maken. Dus niet rouwe code achter el elkaar, maar gecommentarieerde code, en uiteraard gebruik makend van OOP.

Het CMS heeft zijn weg inmiddels gevonden naar een aantal klanten/vrienden van mij. Belangrijk om te weten is dat ik het nooit commercieel verkocht heb, en dat is ook helemaal niet mijn intentie.

Voor mijn eigen websites maak ik natuurlijk ook gebruik van mijn eigen CMS. Het huidige CMS is geschreven in PHP en maakt gebruik van PEAR, met daarbij de modules DB en DataObject. Juist van de laatste module heb ik nu spijt. Dit is een drama om op andere systemen werkend te krijgen. Vooral als de desbetreffende hoster DataObject er niet op wil zetten. De template wordt beheerd met Smarty. Dit met als doel om een terugkerend patroon zoals formulieren en tabellen universeel te laden.

Op de websites zelf wordt er gebruik gemaakt van SEO vriendelijke url’s. Dus: www.example.com/over/contact

Dit principe wil ik nu ook gaan gebruiken voor mijn CMS, hier loop ik nu tegen problemen aan. De opbouw van url betekend niet altijd hetzelfde. Waar op de website zelf het patroon altijd hetzelfde is, dus www.example.com/catagorie/subcatagorie is dit in het cms wel anders. Tenminste zoals ik het nu zie.

Een basis frontcontroller heb ik al. Deze code heb ik overigens niet volledig zelf geschreven.

Bron: http://www.pfz.nl/wiki/frontcontroller/

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
class FrontController 
{ 
    function __construct () 
    { 
        global $path_length,$root_path;
        if ($_SERVER['REQUEST_URI'] != '/') 
        { 
            /*
            * Maak van de url een array
            */
            $parts = explode ( '/', strtolower ( trim ( $_SERVER['REQUEST_URI'], '/' ) ) ); 
            /*
            * Folder en index.php uit de array halen
            */
            for($i = $path_length; $i < count($path); $i++) 
            {
                $v = $path[$i]; 
                $parts[] .= $v; 
            }
            switch(count($parts))
            {
                case 0:
                    /*
                    * Standaard waardes als er niets ingegeven wordt
                    */
                    $controller = 'dashboard';
                    $action = 'index';
                    $vars = array('home');
                    break;
                
                /*
                * Alles groter als 2
                */
                default:
                    $controller = (current($parts));
                    /*
                    * Alles anders dan custom_handling naar content.php
                    */
                    if (!file_exists ( $root_path . $controller . '.php' ))
                    {
                        $controller = 'dashboard';
                        $action = 'index';
                        /*
                        * Rest van array door de pagina af handelen
                        */
                        $vars = $parts;
                    }
                    else
                    {
                        $controller = ( current ( $parts ) ) ? array_shift ( $parts ) : 'dashboard';
                        $action = (current ( $parts ) ) ? array_shift ( $parts ) : 'index';
                        /*
                        * Rest van array door de pagina af handelen
                        */
                        $vars = $parts;
                    }
                    break;
            }
            
        } 
        else
        {
            $controller = 'dashboard';
            $action = 'index';
            $vars = array('home');
        }
        $this ->dispatch ( $controller, $action ,$vars); 

    } 
    
    
    function dispatch ( $controller, $action, $vars = null) 
    {
            global $full_path;
            /*
            * Het verwachtte bestand bestaat 
            */ 
            require_once ( $full_path . $controller . '.php' ); 
            
            $controllername = ucfirst ( $controller ); 

            /*
            * Controleren of de controller bestaat
            */
            if ( class_exists ( $controllername ) ) { 
                if ( in_array ( $action, get_class_methods ( $controllername ) ) ) { 
                    /*
                    * Als de functie bestaat dan uitvoeren
                    */
                    $controllerobject = new $controllername(); 
                    
                    $controllerobject->$action($vars); 
                    /*
                    * Na uitvoering afsluiten
                    */
                    return; 
                } 
            }
        /*
        * Als de functie niet bestaat in ťťm van custom_handlers uitzondering dan naar 404
        */ 
        $error = 'Verkeerde parameters. Ongeldige controller. Vier nul vier, dus';
        $this->show_404($error);
    } 
    
    function show_404($error = null)
    {
        global $vars;   
        /*
        * Zelf bepalen hoe mij 404 er uit ziet
        */
        $this->template = new TemplateSystem('error.phtml');
        $smarty = $this->template->smarty;
        $smarty->assign('error', 'Not Found');
        $smarty->assign('data', 'De pagina kon niet gevonden worden. Klik <a href="http://www.eijsdentelecom.nl">hier</a> om terug te gaan.');
        $this->template->display();
    }



Om duidelijk te blijven onderstaande url als voorbeeld, waarbij je moet bedenken dat mijn CMS een menu boven heeft en een menu aan de linkerzijde. Bovenin het met keuze als bijvoorbeeld websites, webshops en dashboard. Het linkermenu kan bijvoorbeeld bevatten websites beheren, menu beheer, afbeeldingen beheren e.d.
http://www.example.com/level_1/level_2/level_3/level_4/level_5

level_1 = grove keuze (websites,webshops e.d.)
level_2 = fijne keuze (website beheer, content beheer e.d.)

level_3, level_4 en level_5 kan meerdere dingen doen.
Bijvoorbeeld een overzicht opvragen van alle sites gesorteerd op naam
http://www.example.com/websites/beheer-websites/naam/asc

een website bewerken zou er dan zo uit moeten zien.
http://www.example.com/websites/beheer-websites/edit/1

Het idee is dus dat de url binnen het cms ook seo vriendelijk wordt. Het biedt natuurlijk geen voordelen voor bijvoorbeeld google, maar het toont gewoon erg netjes.

De vraag is dus ook zijn er andere mensen die dit probleem opgelost hebben of kunnen we werken aan een breed gedragen systeem die universeel ingezet kan worden, voor allerlei andere systemen.

Het is dus duidelijk niet mijn bedoeling om het CMS gezamenlijk te schrijven, puur en alleen de frontcontroller.

Nou is dit een vraag die ook had kunnen stellen op het forum, maar juist wil ik de discussie op gang brengen om te zien hoe andere dit doen, en wellicht het zover schoppen om het algemeen beschikbaar te stellen van de techniek.