OpenCart : comment enlever "index.php?route=common/home" ?

Voici comment paramétrer OpenCart pour utiliser des URL "SEO", des URL réécrites pour être plus lisibles pour l'utilisateur et les moteurs de recherche.

La solution OpenCart permet de créer un site e-commerce pour sa boutique. Il est possible de paramétrer OpenCart pour utiliser des URL "SEO", des URL réécrites pour être plus lisibles pour l'utilisateur et les moteurs de recherche. En activant cette fonctionnalité, les URL peuvent conserver quand même une partie du nom du script php. Par exemple, pour la page d'accueil, l'URL peut être la suivante :
http://www.monsite.fr/index.php?route=common/home

Il existe plusieurs méthodes pour rendre les URL encore plus orientées "SEO".

La première méthode est la plus simple. Elle consiste à modifier la fonction qui traduit les URL de la solution. Éditez pour cela le fichier "{Répertoire du site}/catalog/controller/common/seo_url.php". Recherchez l'instruction suivante : "return $link;". Ajoutez une ligne avant et insérez-y l'instruction suivante :
$link = str_replace('index.php?route=common/home', '', $link);
L'URL de la page d'accueil sera alors modifiée :
http://www.monsite.fr/
Si vous souhaitez que les URL soient écrites dans un format apprécié par les moteurs de recherche, utilisez plutôt cette instruction :
$link = str_replace('index.php?route=', '', $link);
Les URL auront en conséquence la forme suivante :
http://www.monsite.fr/common/home
Cette solution ne fonctionne qu'avec la version 1 d'OpenCart.

La deuxième solution consiste à modifier la méthode qui crée les URL de la solution. Elle présente l'avantage de fonctionner même si l'option permettant d'utiliser des URL optimisées pour le référencement n'est pas activée. Rendez-vous dans le fichier "{Répertoire du site}/system/library/url.php", et remplacez le code de la fonction "link()" par le code suivant :

public function link($route, $args = '', $connection = 'NONSSL') {
    if ('NONSSL' == $connection) {
        $url = $this->url;
    } else {
        $url = $this->ssl;  
    }
    if ('common/home' == $route) {
        if ($args) {
            $url .= '?' . str_replace('&', '&', '&' . ltrim($args, '&'));
        }
    } else {
        $url .= 'index.php?route=' . $route;
        if ($args) {
            $url .= str_replace('&', '&', '&' . ltrim($args, '&'));
        }
    }
    foreach ($this->rewrite as $rewrite) {
        $url = $rewrite->rewrite($url);
    }
    return $url;
}

Si l'option "SEO URL" est activée dans les paramètres, il est également nécessaire de modifier une instruction dans le fichier "{Répertoire du site}/catalog/controller/common/seo_url.php". Dans la fonction "rewrite()", remplacez cette ligne :
parse_str($url_info['query'], $data);
La nouvelle ligne sera la suivante :
if (isset($url_info['query'])) parse_str($url_info['query'], $data);
Cette modification évitera l'apparition de messages d'erreur du type "Undefined index..." durant la navigation sur le site.

Par ailleurs, OpenCart utilise un système d'extensions appelé "vQmod". Il permet d'appliquer des modifications au coeur de la solution sans modifier les fichiers. De cette manière, vous conservez la possibilité de mettre à jour OpenCart dans devoir réécrire votre code. Pour installer et utiliser vQmod, voici le lien vers la documentation officielle du projet : https://github.com/vqmod/vqmod/wiki.

Une fois vQmod installé, il est possible de créer un script permettant d'utiliser la deuxième solution sans modifier le coeur d'OpenCart. Voici le code du script :

<modification>
    <file name="system/library/url.php">
        <operation>
            <search position="before"><![CDATA[$url .= 'index.php?route=' . $route;]]></search>
            <add><![CDATA[
                if ('common/home' == $route) {
                    if ($args) {
                        $url .= '?' . str_replace('&', '&', '&' . ltrim($args, '&'));
                    }
                } else {
            ]]></add>
        </operation>
        <operation>
            <search position="before"><![CDATA[foreach ($this->rewrite as $rewrite) {]]></search>
            <add><![CDATA[
                }
            ]]></add>
        </operation>
    </file>
    <file name="catalog/controller/common/seo_url.php">
        <operation>
            <search position="replace"><![CDATA[parse_str($url_info['query'], $data);]]></search>
            <add><![CDATA[
                if (isset($url_info['query'])) parse_str($url_info['query'], $data);
            ]]></add>
        </operation>
    </file>
</modification>
Lire aussi
-

SEO et Opencart : résoudre un problème d'URL mal optimisée

Tutoriels SEO