Principe
Pour arriver à mes fins, j’utilise le plugin A2A qui me permet d’indiquer quel est l’article remplaçant d’un article obsolète.
En interne, les liens vers les articles archivés portent la variable GET archive=oui
. Par exemple Un index des sources primaires (1).
Si une personne arrive sur une page archivée sans passer la variable archive=oui
alors elle est redirigée vers la nouvelle version, par une redirection HTTP 301 (redirection permanente).
En revanche si la variable est passée, il reste sur cette page, mais celle-ci possède une meta-donnée qui indique de ne pas l’indexer.
Ceci permet donc d’accéder aux archives du site via la navigation interne de ce site, tout en réorientant les liens externes, dont ceux des moteurs de recherches.
La méthode : la modification des liens
Il existe deux types de liens internes pointant éventuellement vers des archives : ceux générés avec #URL_ARTICLE
dans un squelette et ceux générés avec des raccourcis de la forme [texte->xx]
ou [texte->artxx]
ou [texte->articlexx]
, dans le texte d’un article.
Comment faire pour ajouter des arguments à ces liens seulement si l’article de destination est un article « obsolète » ?
Dans les squelettes
Pour les liens dans les squelettes, c’est relativement simple :
[(#URL_ARTICLE|parametre_url{archive,oui})]
me rajoute ma variable. Sauf que cela le fait sur tous les articles.
Il va donc falloir conditionner. Pour ce faire je crée un squelette inclure/obsolete.html
. Celui-ci renvoie 1
si un article est lié à l’article passé en argument, donc si cet article est « obsolète ». Il ne renvoie rien dans le cas contraire.
Voici le code de ce squelette
<BOUCLE_articles(ARTICLES_LIES){id_article}{par rang}{0,1}>1</BOUCLE_articles>
Je remplace dans mes squelettes toutes les références à #URL_ARTICLE
par :
[(#INCLURE{fond=inclure/obsolete}{id_article}|?{#URL_ARTICLE|parametre_url{archive,oui},#URL_ARTICLE})]
Ce qui en gros veut dire : on utilise le squelette inclure/obsolete
en lui donnant l’id_article courant comme valeur. Si ce squelette retourne quelque chose, alors on renvoie #URL_ARTICLE|parametre_url{archive,oui}
, sinon on renvoie simplement #URL_ARTICLE
.
À noter qu’ici je filtre un squelette appelé via #INCLURE
, ce que je ne peux faire avec <INCLURE>
.
Pour les raccourcis typographiques
Il faut qu’avant que SPIP interprète les raccourcis typographique, je modifie, si cela est pertinent, les formes [texte->artxx]
par [texte->artxx?archive=oui]
. SPIP s’occupera ensuite de la question des urls propres.
Pour faire cela, j’utilise la pipeline pre_liens
, que je déclare dans mon fichier plugin.xml
<pipeline>
<nom>pre_liens</nom>
<inclure>geek_maieul.php</inclure>
</pipeline>
Sur la pipeline pre_liens, je renvoie à l’article de Marcimat.
Je la déclare dans mon fichier geek_maieul.php
.
Commentaires :
- ligne 1 : nom de la fonction / pipeline.
- ligne 2 à 5 : je teste si mon lien interne est bien un lien de type article. Si jamais ce n’est pas le cas, je ne modifie rien et renvoie le lien comme il était avant. Sinon je stocke le numéro de l’article dans le tableau $match, dans l’entrée 1. Pour ce faire, j’utilise une expression régulière.
- ligne 7 : je regarde si mon article a un article lié. J’utilise pour cela la fonction de SPIP
sql_getfetsel()
- ligne 8 et 9 : si mon article a un article lié, je modifie le lien, en ajoutant
?archive=oui
. - ligne 11 : je renvoie le tout.
Redirection
Dans mon fichier article.html
, je teste si mon article a un article lié, et si c’est le cas, j’appelle filtre sur l’URL de l’article lié :
<BOUCLE_nouveau(ARTICLES_LIES){id_article}{par rang}{0,1}>
[(#URL_ARTICLE{#ID_ARTICLE_LIE}|redirect301)]
</BOUCLE_nouveau>
Le filtre |redirect301
est écrit par moi. C’est une fonction php relativement simple
function redirect301($url){
if (_request('archive')!='oui'){
header("Status: 301 Moved Permanently", false, 301);
header("Location:$url");
exit();
}
}
Avant de faire une redirection, je vérifie que je n’ai pas la valeur archive=oui
passée dans l’url [1]
Si c’est le cas, je procède à la redirection.
Méta donnée pour indiquer de ne pas indexer
Dans l’entête de mon squelette d’article, je met
[(#INCLURE{fond=inclure/obsolete}{id_article}|oui)<meta name="robots" content="noindex">]
.
Ce qui a pour conséquent de placer la balise <meta name="robots" content="noindex">
si mon article est obsolète, afin que les moteurs de recherches ne l’indexent plus.
Vos commentaires
# Le 6 janvier 2012 à 14:09, par Loiseau2nuit En réponse à : Archivage avec redirection
<meta name="robots" content="noindex">
tu peux aller plus loin en mettant
<meta name="robots" content="noindex, noarchive, follow">
noarchive est pris en compte au petit bonheur la chance mais doit logiquement empêcher gogol de mettre la page en cache dans son index.
follow, en revanche lui permet quand même de suivre les liens et d’indexer le contenu qu’il y a derrière, peut être utile pour transmettre quand même un peu de jus aux nouvelles versions des articles par exemple ;)
Loiseau2nuit, en mode SEOptimiste ^^