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>

Sera réécrit ainsi :

<span data-product="http://www.exemple.com/mon-lien" class="ma-classe lien-cache">Ancre du lien</span>

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>

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>

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}

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}

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>

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>

(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);
});

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);});

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;
}

Et c’est fini !

Pour voir ce que cela peut donner in situ, visitez ce site consacré au matériel de cuisine, par exemple celle dédiée aux idées cadeau cuisine pour Noël 🙂 : si vous en analysez le code, vous verrez que chaque produit « bénéficie » d’un unique lien, sur son nom (ce qui par défaut représente une baisse de 24 liens internes pour chaque page affichant 12 produits, par exemple !)

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

38 commentaires sur SEO : Optimisation du maillage interne, ou comment masquer des liens
  1. Eljejej Répondre

    Et il serait pas plus simple d’ajouter une balise nofollow sur le lien en double ??

    • Cédric GIRARD Répondre

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

    • Sophie la G-Raph Répondre

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

  2. Raph Répondre

    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
    ++

    • Cédric GIRARD Répondre

      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

      • Sylvain Répondre

        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 🙂

  3. Sophie la G-Raph Répondre

    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 🙂

    • Cédric GIRARD Répondre

      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.

    • Cédric GIRARD Répondre

      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 😉

      • Sylvain Répondre

        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 😉

        • Cédric GIRARD Répondre

          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 ?…

        • Cédric GIRARD Répondre

          [mode mauvaise foi]

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

          [/mode mauvaise foi]

          • Sylvain

            Ah, là, si le reste suit, oui, c’est un vrai alibi, vraiment !

  4. Olivier Duffez Répondre

    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 😉

    • Cédric GIRARD Répondre

      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.

  5. Digiactif Répondre

    Une excellente façon d’optimiser un peu plus son thème PrestaShop.

  6. Benjamin Goodwin Répondre

    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 🙂

  7. Pierre Répondre

    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…

    • Cédric GIRARD Répondre

      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)

  8. Sylvain Répondre

    « 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.

    • Cédric GIRARD Répondre

      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.

  9. tony Répondre

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

    • Cédric GIRARD Répondre

      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)

      • tony Répondre

        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 ?

        • tony Répondre

          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

  10. tony Répondre

    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

  11. tony Répondre

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

  12. Les Résoteurs Répondre

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

  13. Fabrice Répondre

    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

    • Cédric GIRARD Répondre

      Bonjour Fabrice

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

      • Fabrice Répondre

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

        Cool 🙂

        Merci pour votre tuto

        • Fabrice Répondre

          Ok j’ai compris …. LoL….

          c’est la fatigue je pense

          Bref ca fonctionne

  14. Natalie Répondre

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

  15. Valic Répondre

    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 🙂

  16. Jean Répondre

    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. 😉

  17. Diaz Répondre

    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 ?

    • Cédric GIRARD Répondre

      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 !

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.


Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'subscribe_reloaded_show' not found or invalid function name in /home/users3/c/cedricg/www/_SITES/effi10.com/static/lib/plugin.php on line 525