Chemin principal : Accueil > SPIP > Boucle > Archivage avec redirection

Autres chemins : (Aller directement au contenu de l'article)

Archivage avec redirection

vendredi 24 juin 2011, mise à jour mercredi 8 août 2012, par Maïeul
Suivre la vie du site RSS 2.0 Forum

Sur ce site, certains articles sont considérés comme « obsolètes » parce que j’ai trouvé une meilleure méthode pour obtenir le même résultat.

Je souhaitais que google n’indexe plus ces articles, mais soit redirigé vers leurs remplaçants respectifs. En même temps, je souhaitais qu’une personne qui s’amuse à fouiller dans les archives de ce site puisse le cas échéant retrouver l’article.

Voici la manière dont j’ai procédé. Je remercie xdjuj pour m’avoir fourni l’idée de départ.

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

  1. <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 :

  1. [(#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

  1. <pipeline>
  2. <nom>pre_liens</nom>
  3. <inclure>geek_maieul.php</inclure>
  4. </pipeline>

Télécharger

Sur la pipeline pre_liens, je renvoie à l’article de Marcimat.

Je la déclare dans mon fichier geek_maieul.php.

  1. function geek_maieul_pre_liens($texte){
  2. $match = array();
  3. if (!preg_match("#->(?:art)?(?:article)?([0-9]+)\]#",$texte,$match)){ //trouer les liens vers les articles, sans rien derrière
  4. return $texte;
  5. }
  6.  
  7. $obsolete = sql_getfetsel('id_article_lie','spip_articles_lies','id_article='.$match[1]); // y a-t-il un article lié ?
  8. if ($obsolete){
  9. $texte = str_replace($match[1].']',$match[1].'?archive=oui]',$texte); // on
  10. }
  11. return $texte;
  12.  
  13. }

Télécharger

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é :

  1. <BOUCLE_nouveau(ARTICLES_LIES){id_article}{par rang}{0,1}>
  2. [(#URL_ARTICLE{#ID_ARTICLE_LIE}|redirect301)]
  3. </BOUCLE_nouveau>

Télécharger

Le filtre |redirect301 est écrit par moi. C’est une fonction php relativement simple

  1. function redirect301($url){
  2. if (_request('archive')!='oui'){
  3. header("Status: 301 Moved Permanently", false, 301);
  4. header("Location:$url");
  5. exit();
  6. }
  7. }

Télécharger

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.

P.-S.

Il est évident que si je fais pointer l’article A vers l’article B et l’article B vers l’article A je risque d’avoir des problèmes de renvois mutuels. Mais comme je suis le seul rédacteur sur ce site, le risque est minimum.

Notes

[1J’utilise la fonction SPIP _request().

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

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

À propos

Titulaire d’un doctorat en théologie et d’un doctorat en histoire, sous la direction conjointe de Frédéric Amsler et d’Élisabeth_Malamut, je commence à partir du 1er août 2017 un travail d’édition critique des Actes de Barnabé.

Dans le cadre de la rédaction de mon mémoire de master puis de ma thèse de doctorat, j’ai été emmené à utiliser LaTeX, et j’ai donc décider de partager mes techniques. En effet, au cours de mes premiers apprentissages, j’ai découvert que les ressources indiquant les outils pour l’utilisation de LaTeX en sciences humaines étaient rares. Ceci m’a conduit à maintenir ou créer plusieurs packages LaTeX et à donner plusieurs formations.

Par ailleurs, je suis membre actif de la communauté SPIP, au sein de laquelle j’administre le site Spip-Contrib. Je propose sur ce site quelques notes sur SPIP, en général à destination de webmestre.

Il m’arrive également de faire un petit peu de Python, de temps en temps.

Enfin, je tiens un blog de réflexions politiques et religieuses.

Maïeul