SEO : Optimisation du maillage interne, ou comment masquer des liens

L’optimisation du maillage interne d’un site web est aujourd’hui primordial, à l’heure où les référenceurs doivent redoubler d’efforts pour réduire les liens récurrents (et concurrents !) au sein même des sites dont ils ont la gestion… En ce sens, de nombreux CMS basés sur l’utilisation de templates, font rarement l’objet d’optimisations et il n’est pas rare de retrouver, sur une même page, plusieurs fois le même lien vers une page donnée.

Par exemple sur le thème par défaut de Prestashop™ (sur base de Bootstrap), on retrouve donc à minima 3 liens vers chaque produit dans les listes de produits telles qu’affichées sur les pages catégorie :

  • sur l’image
  • sur le nom du produit (en principe une balise titre de type H4 ou H5, selon la version)
  • sur le bouton « Détails » (ou « En savoir plus »)

Bien évidemment, ceci a un impact direct sur le maillage interne, d’abord car le nombre de liens est dilué 3 fois pour chaque produit, mais aussi et surtout parce que, lorsque l’on a plusieurs fois le même lien au sein d’une page, seul le premier dans le code est pris en considération par les moteurs de recherche (en tout cas Google !) ; en d’autres termes, ici ce sera le lien sur l’image qui sera pris en compte…

L’astuce consiste donc à… ne plus lier que le nom du produit vers la page produit, et à user d’un stratagème Javascript (à l’aide de JQuery dans notre cas) pour créer à la volée les liens sur les autres balises concernées ! Pour ce faire, nous allons utiliser remplacer les balises HTML de lien (balise A) par des balises SPAN, et utiliser l’attribut data-product pour insérer le lien à utiliser lors d’un clic.

Ainsi, un lien écrit comme suit :

<a href="http://www.exemple.com/mon-lien" class="ma-classe">Ancre du lien</a>  Langage du code : HTML, XML (xml)

Sera réécrit ainsi :

<span data-product="http://www.exemple.com/mon-lien" class="ma-classe lien-cache">Ancre du lien</span>  Langage du code : HTML, XML (xml)

Aux yeux des moteurs de recherche, les liens ne seront donc pas pris en compte, mais à celui de l’utilisateur, ils apparaîtront comme de classiques zones cliquables, grâce à l’ajout d’un petit bout de Javascript, et d’une pointe de CSS 🙂

Exemple : Optimiser la liste des produits dans Prestashop

Bien entendu, cet exemple est donné comme base de travail, et il vous faudra l’adapter à votre thème si ce dernier n’est pas basé sur le template Bootstrap par défaut de Prestashop 1.6 😉

La première étape consiste donc à aller modifier le fichier template product-list.tpl, dans lequel nous allons d’abord modifier le lien sur l’image du produit, ligne 53 :

<a class="product_img_link"	href="{$product.link|escape:'html':'UTF-8'}" title="{$product.name|escape:'html':'UTF-8'}" itemprop="url"> 	<img class="replace-2x img-responsive" src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home_default')|escape:'html':'UTF-8'}" alt="{if !empty($product.legend)}{$product.legend|escape:'html':'UTF-8'}{else}{$product.name|escape:'html':'UTF-8'}{/if}" title="{if !empty($product.legend)}{$product.legend|escape:'html':'UTF-8'}{else}{$product.name|escape:'html':'UTF-8'}{/if}" {if isset($homeSize)} width="{$homeSize.width}" height="{$homeSize.height}"{/if} itemprop="image" /> </a> Langage du code : HTML, XML (xml)

Ce code devient donc :

<span class="product_img_link lien-cache"	data-product="{$product.link|escape:'html':'UTF-8'}" title="{$product.name|escape:'html':'UTF-8'}"> 	<img class="replace-2x img-responsive" src="{$link->getImageLink($product.link_rewrite, $product.id_image, 'home_default')|escape:'html':'UTF-8'}" alt="{if !empty($product.legend)}{$product.legend|escape:'html':'UTF-8'}{else}{$product.name|escape:'html':'UTF-8'}{/if}" title="{if !empty($product.legend)}{$product.legend|escape:'html':'UTF-8'}{else}{$product.name|escape:'html':'UTF-8'}{/if}" {if isset($homeSize)} width="{$homeSize.width}" height="{$homeSize.height}"{/if} itemprop="image" /> </span> Langage du code : HTML, XML (xml)

On a donc changé la balise A en SPAN, puis modifié les attributs de manière à ce qu’ils coïncident avec notre base de travail.

On va faire de même avec les liens sur les marqueurs optionnels en surimpression sur les vignettes des produits (ligne 87) :

{if isset($product.new) && $product.new == 1} 	<a class="new-box" href="{$product.link|escape:'html':'UTF-8'}"> 		<span class="new-label">{l s='New'}</span> 	</a> {/if} {if isset($product.on_sale) && $product.on_sale && isset($product.show_price) && $product.show_price && !$PS_CATALOG_MODE} 	<a class="sale-box" href="{$product.link|escape:'html':'UTF-8'}"> 		<span class="sale-label">{l s='Sale!'}</span> 	</a> {/if} Langage du code : HTML, XML (xml)

Qui devient donc :

{if isset($product.new) && $product.new == 1} 	<span class="new-box lien-cache" data-product="{$product.link|escape:'html':'UTF-8'}"> 		<span class="new-label">{l s='New'}</span> 	</span> {/if} {if isset($product.on_sale) && $product.on_sale && isset($product.show_price) && $product.show_price && !$PS_CATALOG_MODE} 	<span class="sale-box lien-cache" data-product="{$product.link|escape:'html':'UTF-8'}"> 		<span class="sale-label">{l s='Sale!'}</span> 	</span> {/if} Langage du code : HTML, XML (xml)

Enfin, on va modifier les boutons affichés en-dessous du prix (ligne 147) :

<a itemprop="url" class="button lnk_view btn btn-default" href="{$product.link|escape:'html':'UTF-8'}" title="{l s='View'}"> 	<span>{if (isset($product.customization_required) && $product.customization_required)}{l s='Customize'}{else}{l s='More'}{/if}</span> </a> Langage du code : HTML, XML (xml)

Qui devient :

<span class="button lnk_view btn btn-default lien-cache" data-product="{$product.link|escape:'html':'UTF-8'}" title="{l s='View'}"> 	<span>{if (isset($product.customization_required) && $product.customization_required)}{l s='Customize'}{else}{l s='More'}{/if}</span> </span> Langage du code : HTML, XML (xml)

(en aparté, on peut également virer le contenu de l’attribut href du lien permettant d’ajouter les produits au comparateur, ligne 190 : ça fonctionne très bien sans !)

La seconde étape consiste à ajouter le petit bout de code Javascript (en réalité JQuery), qui va permettre, à la volée, de « modifier » le comportement du clic de souris sur nos balises SPAN fraîchement créées, afin de simuler un lien. Pour ce faire, rendez-vous dans le sous-répertoire /JS, en édition du fichier global.js (je préfère modifier un fichier de script visible partout, au cas où il me prendrait l’idée d’optimiser d’autres zones : modules, menus, etc. et pas seulement les listes de produits…)

Insérons le code suivant vers la ligne 62 :

// Surcharge des liens JS vers fiches produits $('.lien-cache').on('click', function(e) { 	e.preventDefault(); 	var link = $(this).data('product'); 	$(location).attr('href',link); }); Langage du code : JavaScript (javascript)

En clair : sur chaque clic sur les balises de classe « lien-cache », on va modifier ouvrir l’URL contenue dans l’attribut data-product 🙂

EDIT : comme Google peut lire le Javascript (clin d’oeil à @Diije), autant passer en mode « psychopathe » et obfusquer le code, ce qui donne ceci :

var _0x6a38=["\x63\x6C\x69\x63\x6B","\x70\x72\x65\x76\x65\x6E\x74\x44\x65\x66\x61\x75\x6C\x74","\x70\x72\x6F\x64\x75\x63\x74","\x64\x61\x74\x61","\x68\x72\x65\x66","\x61\x74\x74\x72","\x6F\x6E","\x2E\x70\x72\x6F\x64\x75\x63\x74\x2D\x6C\x69\x6E\x6B"];$(_0x6a38[7])[_0x6a38[6]](_0x6a38[0],function(_0xa4acx1){_0xa4acx1[_0x6a38[1]]();var _0xa4acx2=$(this)[_0x6a38[3]](_0x6a38[2]);$(location)[_0x6a38[5]](_0x6a38[4],_0xa4acx2);});  Langage du code : JavaScript (javascript)

Dernière étape : faire en sorte que les internautes voient nos balises comme des liens classiques ! Pour ce faire, rien de plus simple : il suffit de modifier le curseur de souris au niveau CSS. Nous allons donc éditer le fichier global.css du sous-répertoire /CSS du thème, et y ajouter en fin de fichier, les lignes suivantes :

/* LIENS MASQUÉS SUR PRODUITS =================================================== */ .lien-cache { 	cursor: pointer !important; } Langage du code : CSS (css)

Et c’est fini !

On peut imaginer l’économie de liens internes que l’obfuscation peut générer sur une page catégorie de site e-commerce. Si vous avez par défaut 3 liens par produit (titre, image et bouton « En savoir plus » par exemple) par produit, l’obfuscation des liens image et bouton permet de réduire par trois le nombre de liens internes dans la page.

L’usage vaut également (et surtout !) pour les « méga-menus », très souvent défavorables à la répartition intelligente du « jus » SEO.

Pour aller plus loin…

On peut imaginer appliquer cette technique sur n’importe quel site nécessitant une optimisation des liens en interne. À titre d’exemple, on peut imaginer optimiser le maillage d’un site WordPress où les articles sont liés sur leur image à la une en plus du titre de chaque article, que ce soit dans la boucle d’un thème, dans le code d’un shortcode spécifique ou dans un widget ! On peut aussi imaginer très simplement, dans la boucle WordPress, cacher les liens aux moteurs sur le fameux « Lire la suite » qui suit généralement le résumé affiché.

J’ai ainsi optimisé la page d’accueil l’un des template Premium que j’utilise couramment, où j’ai désactivé d’une part les liens vers les pages auteur (inutiles), mais également masqué les liens sur les images, inutiles comme bien souvent d’un point de vue SEO 🙂

Il est aussi envisageable de « masquer » les liens des sous-catégories des branches d’un méga-menu qui ne concerneraient pas la page en cours (dans une optique d’optimisation de type siloing), et bien d’autres choses encore de ce type ! Je pense que ceci fera d’ailleurs l’objet d’un futur article 😉

À tout seigneur, tout honneur : le code JQuery m’a été donné par François, sur le forum Webrankinfo

Voir tous les articles de la catégorie Techniques de référencement

44 réflexions sur “SEO : Optimisation du maillage interne, ou comment masquer des liens”

    1. Avatar de Cédric GIRARD

      Non car malgré l’attribut « nofollow », le lien dilue le jus de la page parmi tous les liens présents 😉

      Répondre
    2. Avatar de Sophie la G-Raph
      Sophie la G-Raph

      @Eljejej: Un lien ne transmet pas le jus, mais il le laisse fuir quand même. lien interne= perte de jus sans rien en retour.
      C’est volontaire et documenté de la part de Google pour lutter contre le PR sculpting.

      Répondre
  1. Avatar de Raph

    Hello, visiblement c’est dans l’ère du temps cette histoire de contrôler son maillage interne 🙂 (cf les discussions twitter)
    Plusieurs choses les id ou class lien-caché cloaking seo sont quand même à éviter (oui je suis parano)
    Ensuite as tu fais des tests poussés pour vérifier que google ne suivait pas ? car j’ai eu quelques cas un peu surprenants. mais il y a tellement de biais possibles que c’est souvent compliqué de tout isolé.
    En tout cas une très bonne reco
    merci l’ami
    ++

    Répondre
    1. Avatar de Cédric GIRARD

      Le nom des classes et autres variables telles qu’indiquées sont évidemment modifiables 😉

      Je vais mettre en place un test ce soir, mais franchement ça me trouerait le c.. qu’il arrive à les suivre. Au pire on peut encoder le lien dans la balise data-product :-p

      Répondre
      1. Avatar de Sylvain

        Il y a plusieurs facettes à la question:
        – Google « voit-il »/suit-il le lien, et si oui, quel poids lui attribue-t-il ?
        Mais on a aussi :
        – footprint/signal spam (d’un point de vue purement statistique) du javascript onclick (par exemple) et pénalité algo
        – suspicion de triche lors d’un examen manuel (peut être déclenché par d’autres facteurs)

        cf le « brain » de Google qui peut très bien décider, sur des critères probabilistes, que les sites qui ont du onclick ont plus de chances d’être de basse qualité.

        my 2 cents, je peux me tromper 🙂

        Répondre
  2. Avatar de Sophie la G-Raph
    Sophie la G-Raph

    Une bonne vielle astuce qui peut encore rendre service, mais à manier avec précaution.

    Quelques remarques:
    -Quand on dit que seul le premier lien d’une page A vers une page B compte, c’est pour la transmission de l’ancre (pour le jus interne, c’est différent).
    -les javascript onclick et les location. se détectent « facilement », et peuvent être cause de pénalité (assimilé à du cloaking)
    -pour aller au bout, astuce de sioux, autant mettre les css et js « .liencaché » dans un répertoire « niquegoogle » et en interdire le crawl 🙂

    Répondre
    1. Avatar de Cédric GIRARD

      Pour les ancres ET transmission de jus, on peut utiliser les ancres (avec le dièse) mais je préfère un seul lien vers une page cible, dans la mesure du possible.

      Répondre
    2. Avatar de Cédric GIRARD

      Après je ne pense pas que ce type de technique soit pénalisable : on ne trompe personne, les pages cibles existent et leur contenu ne change pas selon que l’on est un internaute ou un moteur 😉

      Répondre
      1. Avatar de Sylvain

        Ce n’est pas forcément le lieu pour en discuter en détail, mais à mon sens, pour Google c’est du sculpting, du cloaking (le user « voit » des liens, le bot non), et Google n’est pas connu pour laisser le bénéfice du doute.
        Je ne dis pas que c’est systématiquement pénalisé, mais c’est facilement détectable sans même interpréter le javascript, et ça envoie un signal pour le moins douteux, d’où ma prudence à conseiller comme solution miracle et sans risque 🙂

        Au fond, quelle est ta justification, ton alibi pour cette manip ? C’est juste pour le bien être de l’utilisateur, ou c’est pour ne montrer à Google qu’un seul lien, alors que tu veux que le user clique partout ?

        C’est bien pour tromper Google, pas pour aider l’utilisateur 😉

        Répondre
        1. Avatar de Cédric GIRARD

          Mon alibi c’est d’avoir des pages avec +200 liens internes alors que 50 suffiraient.

          Très souvent ils n’apportent rien à l’internaute, ils sont là uniquement pour une question esthétique.

          Quand on élargit un lien à une zone (la DIV contenant une balise A par exemple) via Javascript, ça passe mais l’inverse non ?…

          Répondre
        2. Avatar de Cédric GIRARD

          [mode mauvaise foi]

          Et en matière d’accessibilité, c’est plutôt positif !!!

          [/mode mauvaise foi]

          Répondre
  3. Avatar de Olivier Duffez

    Merci Cédric d’être allé dans les détails de l’implémentation !
    Cette obfuscation des liens est une technique très ancienne. Elle est séduisante sur le papier, mais dans ton exemple peux-tu nous dire si tu as pu mesurer un impact direct (je veux dire, qu’on peut réellement attribuer à ce changement) ?

    PS : sujet en rapport avec mon article d’hier http://www.webrankinfo.com/dossiers/pagerank/interne 😉

    Répondre
    1. Avatar de Cédric GIRARD

      Merci pour ton passage Olivier.

      Il est trop tôt pour mesurer l’impact direct de cette « optimisation », mais l’ayant mise en place sur divers sites (pas que des Prestashop) j’attends de voir s’il y aura des traces visibles.

      Je vais également mettre en place un test d’indexation, juste histoire d’être certain que les liens ne sont pas suivis par Google.

      Répondre
  4. Avatar de Benjamin Goodwin
    Benjamin Goodwin

    Super Cédric,

    C’est mis en place sur buroespresso 😉

    Pour ceux qui ont peur du « cloaking », c’est comme mettre une balise button sur un bouton panier au lieu de mettre un a href. Et ce n’est pas pénalisé. Idem pour la neutralisation de la navigation à facette.

    Dans mon cas, c’était la dernière optimisation sur les pages de catégorie qui me manquait (enfin à mon sens ^^)

    Je suis pas mal d’expressions reprenant le titre de mes fiches produits. Je vais surveiller et vous dirais si ça remonte ou pas 🙂

    Répondre
  5. Avatar de Pierre

    Alors je vais me faire l’avocat du diable mais dans ce cas, pourquoi ne pas *tout simplement* supprimer les 2 liens en trop du template Prestashop ?

    Puisqu’on parle d’E-commerce et (de façon générale pour cette catégorie de sites) de liens et contenus dupliqués en masse (même produits, même visuels, même descriptions sur des centaines de sites) je préconiserai de désoptimiser tout ça puisque de toute façon il y a plus de critères négatifs que positifs (risque de signal spammy envoyé à Google) à vouloir se démarquer des concurrents avec du SEO à outrance.

    Donc pour moi, on ne garde que le lien parfaitement désoptimisé sur ‘ »en savoir plus » et on se complique pas la vie avec de l’offuscation JS et des répertoires bloqués pour GoogleBot…

    My 2 cents…

    Répondre
    1. Avatar de Cédric GIRARD

      Mmmhhh quitte à supprimer les liens, je préférerais conserver l’officiel, celui sur le nom du produit : ce n’est pas de la suroptimisation, et surtout en matière d’accessibilité, c’est simplement la (seule ?) solution.

      Après oui, pourquoi pas, supprimer les liens ? D’ailleurs j’ai utilisé dans le passé un template (c’était sur une version 1.1) qui n’avait pas de bouton « Détails » dans la mesure où le lien englobait la DIV avec l’image et le titre du produit (le titre était avant l’image dans le code)

      Répondre
  6. Avatar de Sylvain

    « Quand on dit que seul le premier lien d’une page A vers une page B compte, c’est pour la transmission de l’ancre (pour le jus interne, c’est différent). »

    Je suis totalement d’accord, et du coup ceci règle une grande partie des problèmes que l’on imagine.

    3 liens = 33% de jus pour chaque, si la première ancre est bonne, tout roule, pas la peine de se prendre la tête.

    Répondre
    1. Avatar de Cédric GIRARD

      Je suis d’accord concernant l’ancre, mais pour le jus je n’en ai pas la certitude, sauf preuve du contraire 😉 ; est-ce d’ailleurs mesurable ?…

      Je compte au passage appliquer cette technique à d’autres liens « inutiles », simplement là pour l’ergonomie.

      Répondre
  7. Avatar de tony

    bonjour,
    merci pour cette astuce
    en page acceuil sur le module news les liens images et bouton ne fonctionne pas
    @+

    Répondre
    1. Avatar de Cédric GIRARD

      Bonjour

      Normal si vous utilisez des modules spécifiques genre blocknewproducts ou assimilé : il faut en modifier le code en conséquence 😉

      Si ma boutique ça fonctionne car le thème Bootstrap par défaut, pour les listes de produits quelles qu’elles soient, génère le même code dans tous les modules (quasiment)

      Répondre
      1. Avatar de tony

        Bonjour, sur la page accueil module blocknewproduct la souris change bien mais je suis pas redirigeé vers le produit il y a que le nom du produit qui fonctionne
        quand on regarde le code on vois bien le lien pourtant
        http://puu.sh/lBDDE/101bef8de6.jpg
        une idée ?

        Répondre
        1. Avatar de tony

          bonjour
          j’essaye de faire les changements dans le fichier blocknewproducts.tpl du theme default-bootstrap
          mais rien ne ce passe
          c est bien ce fichier qui faut modifier pour les produit nouveauté qui apparaisse en page accueil ?
          merci de votre aide

          Répondre
  8. Avatar de tony

    bonjour je suis sur prestashop 1.6.0.6
    il faut modifier le blocknewproducts_home.tpl ?
    voici mon fichier origine
    {counter name=active_ul assign=active_ul}
    {if isset($new_products) && $new_products}
    {include file= »$tpl_dir./product-list.tpl » products=$new_products class=’blocknewproducts tab-pane’ id=’blocknewproducts’ active=$active_ul}
    {else}

    {l s=’No new products at this time.’ mod=’blocknewproducts’}

    {/if}
    je cale

    Répondre
  9. Avatar de tony

    Bonjour,
    j’ai trouvé l erreur a mon probléme
    tout fonctionne sans modifier les modules blocknewproducts
    merci pour cette article

    Répondre
  10. Avatar de Les Résoteurs

    J’ai pris plaisir à lire ton article superbement bien rédigé. J’aimerai en lire plus souvent comme ça.
    A partager sans modération 😉

    Répondre
  11. Avatar de Fabrice

    Bonjour
    Vous avez ajouter le code :

    var _0x6a38=[« \x63\x6C\x69\x63\x6B », »\x70….

    à quel niveau ?

    dans

    // Surcharge des liens JS vers fiches produits
    $(‘.lien-cache’).on(‘click’, function(e) {
    e.preventDefault();
    var link = $(this).data(‘product’);
    $(location).attr(‘href’,link);
    });
    ????
    sous la ligne 4

    ou autre part ?

    Merci

    Répondre
    1. Avatar de Cédric GIRARD
      Cédric GIRARD

      Bonjour Fabrice

      Le code obfusqué remplace celui du dessus en réalité : c’est exactement la même chose, mais crypté 😉

      Répondre
      1. Avatar de Fabrice

        Ok donc je remplace var link = $(this).data(‘product’);
        par le code crypté.

        Cool 🙂

        Merci pour votre tuto

        Répondre
        1. Avatar de Fabrice

          Ok j’ai compris …. LoL….

          c’est la fatigue je pense

          Bref ca fonctionne

          Répondre
  12. Avatar de Natalie

    Bonjour
    Pensez-vous que l’augmentation du nombre de liens internes, autant que possible augmentera la valeur de SEO?

    Répondre
  13. Avatar de Valic

    Tiens le monde est petit, je ne savais pas que tu avais ce site… Tu en avais link un autre sur Impact IM 😉

    Je vais prendre le temps de lire un peu tout ça 🙂

    Répondre
  14. Avatar de Jean

    Merci pour le partage du code, de mon côté j’utilise un fichier JS hébergé sur un autre domaine qui est interdit à l’indexation. 😉

    Répondre
    1. Avatar de Cédric GIRARD
      Cédric GIRARD

      Ah oui pas bête du tout !!!

      Comment n’y ai-je pas pensé plus tôt ?…

      Répondre
  15. Avatar de Diaz

    Merci à vous pour cet article, très pratique car je bosse également sur des sites qui utilisent Prestashop. Tu as pu mesurer un impact suite à l’utilisation de cette technique ?

    Répondre
    1. Avatar de Cédric GIRARD

      Il est difficile de mesurer l’impact de la mise en place de ce type de technique, mais à contrario je suis en train de réaliser une nouvelle « version » de l’obfuscation avec pour objectif de monter un silo à partir d’un site Prestashop. Et là l’impact sera sans doute significatif !

      Répondre
      1. Avatar de Diaz

        D’accord merci à vous ! Et vous allez publier la nouvelle version de l’offuscation PHP/JS ?

        Répondre
  16. Avatar de tony loza

    Bonjour
    j’ai suivi ce tuto et je rencontre des souci
    sur toutes mes vignette image produit j ‘ai maintenant un span Détails qui apparaît
    et le curseur change pas sur l image il y a que le titre du produit qui fonctionne
    je suis sur prestasop 1.6.1.3
    merci pour votre aide

    Répondre
  17. Avatar de tony loza

    bonsoir
    j’ai régler le problème du span détail.
    mais ‘j ai que le lien du titre du produit qui est cliquable.
    le survole de l image et le clic fonction pas

    Répondre
  18. Avatar de tony loza

    bonsoir
    rectification le clic fonctionne mais le curseur change pas au survole
    j’ai garder que le script car si je remplace par le code obfusquer le clic sur l’image fonctionne pas.
    pouvez vous maider
    merci

    Répondre

Laisser un commentaire

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

Retour en haut