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} Langage du code : PHP (php)

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} Langage du code : HTML, XML (xml)

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…

Pour rétablir vos positions après avoir corrigé les problématiques de contenu dupliqué, n’hésitez pas à faire appel à un service spécialisé backlink pour favoriser l’indexation et la popularité de vos pages.

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" /> Langage du code : HTML, XML (xml)

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} Langage du code : PHP (php)

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 🙂

Voir tous les articles de la catégorie Prestashop

15 réflexions sur “Prestashop 1.6 : encore du duplicate content ?…”

  1. Avatar de Kev

    Bonjour,

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

    Répondre
    1. Avatar de Cédric GIRARD

      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.

      Répondre
      1. Avatar de Kev

        En effet cela fonctionne 🙂 Merci beaucoup.

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

        Répondre
      2. Avatar de Kev

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

        Répondre
  2. Avatar de alex

    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

    Répondre
    1. Avatar de Cédric GIRARD

      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.

      Répondre
      1. Avatar de alex

        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 ?

        Répondre
        1. Avatar de Cédric GIRARD

          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.

          Répondre
  3. Avatar de Axel

    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 🙂

    Répondre
    1. Avatar de Kurb

      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

      Répondre
  4. Avatar de Romain

    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

    Répondre
  5. Avatar de francois

    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

    Répondre
  6. Avatar de Valic Web

    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.

    Répondre
  7. Avatar de Olive

    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

    Répondre
  8. Avatar de greg

    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

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut