Prestashop 1.6 : encore du duplicate content ?…

Si les dernières version de Prestashop™ ont clairement fait des progrès en matière d’optimisation « on page », il demeure quelques petites lacunes agaçantes, et plus particulièrement en matière de gestion (fine) du duplicate content (contenu dupliqué en français).

Le problème : Prestashop n’interdit que ce qu’il connait !

Nativement la gestion de l’indexation est gérée via le fichier robots.txt, qui interdit l’accès à un certain nombre de pages :

  • Tout le contenu des répertoires techniques et d’administration du site
  • Les pages avec paramètres d’URL connus
  • Les pages dites secondaires : panier, processus de commande, gestion du compte utilisateur, etc.

Cependant, j’ai constaté qu’il arrivait que des pages non gérées nativement par le CMS au niveau des URLs soient indexées par Google et généraient ainsi du contenu dupliqué. Cela peut arriver suite à des erreurs d’utilisateurs, mais aussi – pourquoi pas – suite à des actions volontaires d’un concurrent pour potentiellement nuire au référencement…

Par exemple : http://www.maboutique.com/15-ma-categorie?icinimportequoi passe en « index,follow » et surtout n’est pas bloquée (vous pouvez tester avec les Google Webmaster Tools sur votre propre boutique !) par le robots.txt !

En clair, il n’y a nativement aucun contrôle ni indicateur pour les moteurs de recherche leur permettant de savoir si une page est légitime ou non.

La solution : une balise « rel Canonical » systématique !

J’ai été épaté que cette balise ne soit pas nativement gérée dans les thèmes par défaut de Prestashop (pourtant très bien optimisés), et j’ai donc logiquement recherché le moyen de l’intégrer sans effort. Une astuce consiste très simplement à passer par le fichier header.tpl de votre thème, et d’y insérer quelques lignes de code, juste en-dessous de l’appel du hook du header :

{$HOOK_HEADER}

Insérer le code sous le hook permet de récupérer les valeurs de certaines variables propres à Prestashop, et plus particulièrement les variables $page_name (qui contient le type de page appelée) et $request (qui contient l’URL appelée). Ainsi, selon le type de page appelée, on pourra décomposer l’URL appelée et renvoyer dans une balise Canonical l’URL native sans paramètres éventuels. Voici un exemple d’implémentation basique, mais qui fonctionne très bien :

{if $page_name == 'index'}
	<link rel="canonical" href="{$base_dir}" />
{elseif $page_name == 'category' or $page_name == 'best-sales' or $page_name == 'cart' or $page_name == 'discount' or $page_name == 'manufacturer' or $page_name == 'supplier' or $page_name == 'new-products' or $page_name == 'prices-drop' or $page_name == 'product'}
	{assign var=url_canonical value="?"|explode:$request}
	<link rel="canonical" href="{$url_canonical[0]}" />
{/if}

Ainsi, à chaque appel de page avec un ou des paramètres, ou n’importe quelle chaîne de caractère derrière l’URL, l’URL canonique sera clairement indiquée aux moteurs de recherche, limitant ainsi l’indexation des pages inutiles 🙂

Depuis Prestashop 1.4, les URL de catégories, produits, fournisseurs, CMS et fabricants qui sont mal orthographiées sont automatiquement redirigées vers les URL correctes, par rapport à leur identifiant numérique. Il n’y a aucune nécessité à aller rechercher les « bonnes » URL comme c’était le cas dans les premières versions de Prestashop.

ATTENTION : Modification au 31/03/2015 ; j’ai viré les pages CMS car l’URL redirigée n’est pas toujours correcte…

En complément : la balise meta robots

On peut également empêcher l’indexation de certaines pages inutiles, en améliorant par exemple la gestion de la balise meta robots sur les pages avec paramètres connus, en insérant au-dessus de cette ligne (toujours dans le fichier header.tpl de votre thème) :

<meta name="robots" content="{if isset($nobots)}no{/if}index,{if isset($nofollow) && $nofollow}no{/if}follow" />

Le code suivant (qui va assigner une valeur à la variable Smarty nobots et rendre les pages non indexables) :

{if isset($smarty.get.orderby) || isset($smarty.get.orderway) || isset($smarty.get.n) || isset($smarty.get.p) || isset($smarty.get.tag) || isset($smarty.get.id_currency) || isset($smarty.get.search_query) || isset($smarty.get.back)}
	{assign var=nobots value="1"}
{/if}

Désormais, toutes les pages avec paramètres reconnus de Prestashop (ordres de tri, numéros de pages, mais aussi pages utilisant un « controller » comme les pages de recherche et autres) passeront systématiquement en « noindex,follow » 🙂 (attention cependant avec les boutiques multilingues : je n’ai pas testé !)

ATTENTION : ne fonctionne pas sur les versions antérieures à Prestashop 1.6 !

Conclusion : Ceinture ET bretelles !

Avec ce petit hack sans prétention, vous avez une bonne base de travail pour améliorer la gestion du duplicate content sur votre site e-commerce Prestashop. Il est tout de même étonnant que le CMS ne gère pas aujourd’hui cela nativement, car je me souviens encore de mon intervention au Barcamp éponyme en 2009, avec une petite conférence sur ce sujet (elle concernait les versions 1.0 et 1.1 !) qui avait soulevé bien des questions dans l’auditoire !

Il va sans dire que tout ceci est très certainement encore améliorable, mais n’ayant plus touché Prestashop ces derniers temps, je suis ouvert à toute remarque en la matière 🙂

15 commentaires sur Prestashop 1.6 : encore du duplicate content ?…
  1. Kev Répondre

    Bonjour,

    J’aimerais faire la même chose pour PS 1.5.4.1, pouvez-vous m’aider ?

    • Cédric GIRARD Répondre

      J’ai mis en place ce code sur un Prestashop 1.5.4.1 sans soucis, SAUF pour la balise Robots comme indiqué 😉

      En principe ça fonctionne sur du 1.5 sans aucun problème.

      • Kev Répondre

        En effet cela fonctionne 🙂 Merci beaucoup.

        J’imagine que cela est assez long pour que Google fasse le ménage ?

      • Kev Répondre

        Edit : la seconde partie fonctionne également très bien sous Prestashop 1.5.4.1 🙂

  2. alex Répondre

    Bonjour,

    Je me retrouve avec des duplicate du style

    /?route=product%2Fproduct&product_id=52
    hxxp://www.monsite.com/categorie/produit.html?&deletePicture=11

    Est ce que La solution : une balise « rel Canonical » va résoudre le problème ?

    Merci

    • Cédric GIRARD Répondre

      Bonjour Alex

      Oui effectivement ça aidera beaucoup à limiter les problématiques de duplicate content 🙂

      L’idéal étant bien sûr de « filtrer » à la source ce type d’URL.

      • alex Répondre

        merci pour la réponse et l’intervention 😉
        J’ai suivi la procédure, savez vous combien de temps faut-il compter pour que les pages ne soient plus vu comme duplicate par google webmaster tool ? Y a t il quelque chose à faire pour accélérer les choses, du style « explorer comme google » ou soumettre l’url à google, ou utiliser des services de ping pour que le moteur de recherche google s’en aperçoive plus rapidement ?

        • Cédric GIRARD Répondre

          Cela va relativement vite ; personnellement je laisse faire Google, qui est assez grand pour résoudre les problématiques d’URL (idem pour les pages en HTTP 404 d’ailleurs)

          Il y a probablement une méthodologie pour accélérer la donne, mais cela n’a que peu d’intérêt, le SEO se jouant sur le moyen/long terme à mon sens.

  3. Axel Répondre

    Bonjour,
    Merci beaucoup pour ces conseils.
    J’aurais des questions complémentaire par rapport au https :
    – est-ce utile d’indiquer une adresse canonique en https ?
    – comment adapter le code proposé pour que les adresses canoniques soient bien en https ?
    Merci bcp 🙂

    • Kurb Répondre

      replacer $base_dir par $base_dir_ssl pour la page index pour passer sur une url canonical en https.
      les autres urls prennent deja compte du https

  4. Romain Répondre

    Bonjour,

    Je me permets de revenir sur le sujet même s’il date un peu.
    Est-ce que l’option « Rediriger vers l’URL canonique » du Back Office dans la partie SEO & URL ne solutionne pas le problème ?

    Merci

  5. francois Répondre

    bonjour,

    merci pour l’astuce. ce code permet-il de régler le problème de duplicate content concernant les produits indexés dans différentes catégories ?

    par exemple un produit se trouve dans la catégorie principale « Cuisine » mais aussi dans la sous catégorie « ustensile de cuisine ».

    Dans webmaster tools, google considère cela comme des balises meta en double.

    Ce serait assez incroyable de pourvoir régler ce problème avec ce code !

    Merci

    Francois

  6. Valic Web Répondre

    Je me pose la même question que Romain !
    En tout cas merci, je vais essayer ça tout de suite.
    En espérant que la version 1.7 de prestashop règle un peu tout ça… Je n’ai pas encore lu les nouveautés mais je sais qu’elle a été annoncée.

  7. Olive Répondre

    Bonjour,

    Même remarque que François sur les produits dans plusieurs catégories.

    De plus, je me pose la question par rapport aux filtres proposés sur les boutiques en ligne qui ajoute des paramètres aux URLs et qui sont néfastes au SEO apparement… Quelqu’un aurait une solution ?

    Merci

  8. greg Répondre

    Bonjour,
    merci pour le code !
    je suis en prestashop 1.6.09
    je voulais savoir si avec ce code inséré dans mon header, mes pages categories allaient donc bel et bien passés en canonique et toutes les autres de la meme categories ( pagination, filtre…) serait donc non canonique privilégiant ainsi la page catégorie par défaut ?

    merci d’avance pour votre confirmation

Laisser un commentaire

Votre adresse email ne sera pas publiée. Merci de saisir votre nom ou pseudo (pas de pseudo SEO merci !), votre email et votre commentaire.