cdillat

Liens toutes pages : Varier les ancres de manière presque aléatoire

Rédigé par Cdillat - 15 février 2013 - 16 commentaires

Varier ses ancres

Suite à un article paru sur pimpmycode.fr je vais vous filer un tips rapide qui permet de faire varier ses ancres dans le cas d'un échange de liens toutes pages.

J'utilise cette technique depuis un moment et elle permet de faire des choses sympas et surtout de nouer des partenariats un peu plus originaux que le traditionnel échange de liens "toutes pages".

Changer ses ancres de manière aléatoire : le principe

Le principe est simple, vous allez faire apparaitre sur votre site (en footer par exemple) des liens vers un partenaire mais sur chaque page, l'ancre va changer.

Contrairement à un bon vieux random, je vous propose de faire apparaitre toujours la même ancre sur la même page.

Varier ses ancres : le code

Un peu de code commenté pour démontrer le bouzin :

<?php
/***
 * @author Cdillat
 * @website http://cdillat.fr
 */

/*On prend trois ancres différentes pour l'exemple*/
$anchors = array('cdillat','must read','mon blog');
/*On compte le nombre d'ancres différentes*/
$countAnchors = count($anchors);
/*On choisit un ancre de manière pseudo aléatoire en fonction de l'url*/
$anchorId = hexdec(substr(md5($_SERVER['REQUEST_URI']), -1 * ceil($countAnchors / 16))) % $countAnchors;
$anchor = $anchors[$anchorId];
/*Maintenant qu'on a choisi l'ancre on l'affiche*/
echo '<a href="http://cdillat.fr">'.htmlspecialchars($anchor)."</a>";
?>

Bien entendu la ligne permettant de choisir l'ancre peut vous paraitre complexe. Pour faire simple elle transforme l'url de la page ($_SERVER['REQUEST_URI']) en hexadécimal (md5).

Ensuite, en fonction du nombre d'ancres différentes, on choisit une partie de ce code hexadécimal pour le transformer en nombre (hexdec ....), le tout modulo le nombre d'ancres (pour s'assurer qu'on tombe sur un nombre < 3 dans l'exemple).

En me relisant, je doute que la version "en français dans le texte" soit plus claire que le code php mais l'intention était là.

Varier les ancres : aller plus loin

Quelques pistes en vrac pour agrémenter cette technique de base :

Thats all folks

Classé dans : Articles Seo - Mots clés : aucun

Écrire un commentaire

Attention ! Les commentaires sont soumis à modération.

16 commentaires
Sylvain

vendredi 15 février 2013 à 18:44 Sylvain a dit : #1

Yep, bien vu.
Jérémy est un grand utilisateur de cette technique, c'est lui qui m'a inspiré l'article.

Une chose à surveiller quand on fait ça, surtout avec des hash d'urls, c'est la distribution du générateur pseudo aléatoire avec les urls du site.
On peut facilement se planter et obtenir une répartition complètement foireuse (des alternatives qui ne sortent jamais et d'autres trop souvent)
Donc si vous jouez à ça, faites un test rapide avec votre sitemap par sécurité ;)

Cdillat

vendredi 15 février 2013 à 18:54 Cdillat a dit : #2

@Sylvain :
Yes Emile m'a dit la même chose que toi pour Jerem et +1 pour la distribution ;)

Guillaume Desbieys

vendredi 15 février 2013 à 19:41 Guillaume Desbieys a dit : #3

Ah ouai vraiment pas bête ça.
J'avais déja pensé à un truc du genre mais je n'était pas allé aussi loin.
C'est à dire que je me disais, "ouai mais mon script affichera une ancre aléatoire"... du coup c'est pas top pour Google si à chaque visite l'ancre change...
Et là le coup de convertir en hexa puis un p'tit modulo permet d'avoir la même ancre à chaque refresh.
Et surtout ça évite d'avoir une base de données uniquement pour cela ;)
Bien vu !

Mais je viens de penser que l'on pouvais aussi utiliser cette astuce en changeant aussi l'URL.
Du coup on pourrait utiliser un array du genre array('Ancre' => 'URL', 'Ancre2' => 'Url2') pour pouvoir faire du sitewide sans que ça soit du sitewide !
On varie ses ancres, on varie ses pages de destination.

Après c'est sur que c'est un poil plus lourd à mettre en place, mais je pense que le jeu en vaut la peine.

Martin

vendredi 15 février 2013 à 19:56 Martin a dit : #4

Si l'on peut lire, dans la documentation des fonctions de génération de nombres pseudo aléatoires rand() et mt_rand()... « pseudo aléatoires », plutôt que « aléatoires », c'est que ces fonctions ne génèrent pas de nombres aléatoires. En réalité, à partir d'une même « graine » de départ, elles génèrent toujours la même séquence de nombres.

Du coup, je pense que le code serait plus clair avec quelque chose de ce style :

mt_srand( crc32( $_SERVER['REQUEST_URI'] ) );
$anchorId = mt_rand( 0, $countAnchors );


Le code devient plus clair, car plus commun, et donc plus lisible par d'autres développeurs, que de sombres formules au sens très mystique.

Qu'en dis-tu ?

(Petit détail de psychorigide que je suis : ajoute un espace après le "/*". C'est en effet la manière habituelle de faire, donc plus lisible pour la majorité des développeurs. Et dans le cas de commentaires limités à une seule ligne, préfère "//". D'une part, parce que c'est plus simple et habituel. D'autre part, cela te permettra de commenter tout un bloc de code commenté ainsi via "/*" et "*/", ce que tu ne pourrais faire autrement.)

Cdillat

vendredi 15 février 2013 à 19:57 Cdillat a dit : #5

@Guillaume Desbieys :
De ce que je vois on est nombreux à y avoir pensé, pour ta seconde remarque (variation url) : check les pistes à la fin de l'article ;)
@Martin :
Pas bête le coup du mt_rand, je viens de tester vite zef et on dirait que ça groove.

Mystique mystique ... Ok ce n'est pas facile à lire mais bon de l'hexa et du modulo c'est pas non plus la mer à boire pour un dev.

Merci pour tes conseils de formatage mais à l'avenir laisse ton coté psychorigide à la maison ;)

Le Juge

vendredi 15 février 2013 à 20:48 Le Juge a dit : #6

Joli, et tellement simple dans l'idée que ca en est presque élégant.

On pourrait aussi penser a une extension de ce meme script qui change les pages de destination du lien - tout en gardant un des ancres différentes et sur les memes pages.

Labisse

vendredi 15 février 2013 à 20:51 Labisse a dit : #7

Le code est très sympa, mais j'ai quand même un gros doute au niveau de l'interprétation de GG, si a chaque fois que celui passe sur une page "n" il voit l'ancre se modifier je ne suis pas certain que sur le long terme il va aimer, mais il faut tester pas de doute là dessus. Perso je finalise un truc sous WP qui crée une ancre fixe mais avec la même URL en fonction de la catégorie (in_category et is_category) c'est je pense plus safe, mais rien n'est moins sur non plus. Sinon très sympa comme partage THX je vais le tester sur quelques sites et voir ce que ela donne, je te tiens au jus

Philippe

vendredi 15 février 2013 à 20:53 Philippe a dit : #8

Astucieux comme idée, je vais tester le principe sans utiliser de script pour débuter. Afin d'analyser l'efficacité en terme de référencement, je me pose une question : ça ne pourrait pas sembler "suspect" d'utiliser une ancre différente par page vers le site cible ?

Cdillat

vendredi 15 février 2013 à 20:56 Cdillat a dit : #9

@Le Juge :
Varier les urls ... un peu comme dans le paragraphe "aller plus loin" ? ;)
@Labisse :
Le but c'est justement que le lien reste le même sur une page N, par contre du coup tu me fais penser que j'ai oublié de préciser que si le nombre {d'ancres|de liens} cela modifie la distribution.
@Philippe :
A toi de voir, si tu penses que c'est moins louche d'avoir la même ancre : tu peux faire du toutes pages classique :D. Perso, je profite de cette technique pour faire des liens sur des pages profondes en variant aussi les urls ;)

Le Juge

vendredi 15 février 2013 à 21:22 Le Juge a dit : #10

Oui, mais comme je suis une grosse feignasse, je pensais trouver le code déjà tout écrit et commenté et tout ;)

Cdillat

vendredi 15 février 2013 à 21:29 Cdillat a dit : #11

@Le Juge :
Le beurre, l'argent du beurre et le c** de la crémière ^^
PS : avec un générateur de spuns non aléatoire c'est easy :D

Martin

samedi 16 février 2013 à 01:05 Martin a dit : #12

Oups ! On dirait que j'ai laissé un petit bug dans ma suggestion de tout à l'heure. Voici un correctif :

mt_srand( crc32( $_SERVER['REQUEST_URI'] ) );
$anchorId = mt_rand( 0, $countAnchors - 1 );

En effet, si on a un tableau de 3 éléments (comme dans l'exemple), $countAnchors vaut 3, mais les indices vont de 0 à 2 (donc de 0 à $countAnchors - 1).

On va dire que c'est la fin de semaine...

Sinon, pour en revenir au principe, discuté par ailleurs très succinctement sur Twitter, je me permettrai d'ajouter que :

- mieux vaut éviter des liens depuis toutes les pages du site, même en variant les textes d'ancres, car cela peut, à plus ou moins brèves échéance (à moins que cela ne soit déjà le cas ?), être sensiblement dévalué, à l'instar des autres liens « sitewide » ;

- plutôt que de varier juste le texte d'ancre, mieux vaut varier l'ensemble d'une phrase où celui-ci apparaît afin de limiter des pénalités sur les liens isolés ;

- du coup, l'utilisation d'un master spin de bonne facture, de préférence limité à certaines parties thématiques du site, connexes aux deux sites, est très largement préférable ;

- il faut bien garder à l'esprit qu'il s'agit d'une astuce visant à manipuler les moteurs de recherche, et qu'en tant que telle, les moteurs de recherche risquent fortement de ne pas l'apprécier, pouvant aller jusqu'à la pénalité des sites sources et destination des liens (avec le temps, Google a une définition effective de plus en plus large du spam web) ;

- il y a d'autres remarques concernant cette technique et ses améliorations, mais... je préfère en rester là. (Il faut bien garder quelques secrets de fabrication sur soi, non ?)

Cdillat

samedi 16 février 2013 à 09:47 Cdillat a dit : #13

@Martin :
Après qu'est qu'un lien sitewide .... Si les ancres changent de page en page : il n'est plus si sitewide et si les pages de destinations varient ... peut être encore moins ;)
D'accord avec toi pour le master, c'est d’ailleurs une des pistes d'amélioration que je donne en fin d'article.

J'ai introduit cette technique en tant que "tips rapide". Le but n’était pas de filer une méthode "de killer" mais de partager l'idée de base avec quelques pistes d'améliorations.
J'ouvre des portes (que d'autres ont aussi ouvertes) maintenant à chacun d'améliorer à sa sauce ;)

SylvainDeaure

lundi 18 février 2013 à 11:30 SylvainDeaure a dit : #14

@Martin , à propos des générateurs pseudo aléatoires et du mt_rand, attention,
cf l'article cité sur pimpmycode :
Le fonctionnement de mt_srand a changé au fil des versions php, et un même seed ne donnera plus la même séquence.
Cf l'article qui détaille et donne des implémentations alternatives.

@CDillat, avec cette technique d'initialisation du générateur pseudo-aléatoire, il n'est PAS utile de tirer les spuns de manière déterministe : un algo "bete" qui va choisir les alternatives au hasard choisira toujours les mêmes alternatives dans le même ordre pour un même seed initial. Même s'il y a 3 millions d'alternatives et de tirages "au sort", chacun est déterminé par le précédent, et donc par le seed.
Il y a beaucoup à dire d'ailleurs là dessus au niveau du tirage des spuns, mais on s'écarte du sujet ;)

Cdillat

lundi 18 février 2013 à 11:42 Cdillat a dit : #15

@SylvainDeaure :
Comme le montre le petit code de cet article, je ne suis pas un habitué des générateurs aléatoires. Quand je parle aléatoire je fais souvent le raccourci (à tord) avec la fonction rand ... sans seed. Merci pour cette précision ;)

Martin

lundi 18 février 2013 à 18:30 Martin a dit : #16

@Sylvain a parfaitement raison ! (Grrrr !) Du coup, ma proposition devient incorrecte. (Flûte, désolé d'avoir induit tout le monde en erreur.)

D'abord, la suite des nombres aléatoires peut changer selon les versions du PHP (il y a donc eu un « avant » et un « après » PHP 5.2.1 au niveau du mt_rand()). Une mise-à-jour du PHP peut donc changer les liens des pages entre « avant » la mise-à-jour et « après » la mise-à-jour. Bon, ce n'est pas très grave, les liens qui changent, en général, une fois de temps en temps. De plus, on est sans doute tous passés au PHP 5.3, voire PHP 5.4, et c'est le seul changement de l'algorithme de mt_rand() qu'il y a eu sur la durée de vie du PHP. Ce n'est donc pas très fréquent. En soi, on pourrait dire « pas grave, j'utilise quand même le couple mt_srand()/mt_rand() ! » sans conséquence majeure. Au pire, on passe à srand() et rand() qui sont moins (pseudo-)aléatoires, et qui se calquent sur la bibliothèque C qui a maintenant quelques décennies d'utilisation stable ici. Que le pseudo-aléatoire soit vaguement pourri ici n'est pas gênant.

Ensuite, des extensions telles que Suhosin peuvent rendre l'initialisation du générateur de nombres aléatoires (srand() ou mt_srand()) inopérante. Ça, j'avoue, je ne l'ai pas du tout, mais alors pas du tout vu venir. Or, un serveur sous Debian Squeeze (la dernière version stable en date) active Suhosin par défaut. Certes, par défaut, les srand() et mt_srand() conservent leur fonctionnement attendu, celui de la documentation du PHP (ouf !) Mais il est possible qu'un serveur configuré autrement ne suive pas cette voie.

En conséquence, même si ma proposition reste valable dans la majorité des cas (hé hé, je me rattrape ?), elles n'est pas viable pour « partir dans la nature ». Il convient donc, comme le suggère Sylvain par ailleurs, d'utiliser une implémentation purement PHP d'un générateur de nombres aléatoires. Au pire, si on refuse le code d'autrui, et qu'on est flemmard, ça peut être un (long) tableau initialisé avec un lancer de dés. ;)