Comment corriger les redirections après un changement d'URL ?

WordPress est un CMS assez bien conçu. Lors d'un changement de structure de permaliens il garde en mémoire la structure précédente de manière à rédiriger automatiquement les anciens liens vers les nouveaux, et il existe un mécanisme similaire pour les slugs des articles avec une option _wp_old_slug

Si tout se passe bien lors d'une mise à jour, si par contre vous changez plus de 2 fois de suite votre structure de permaliens ou vos slugs ça ne marchera plus, avec même des risques de boucles de redirections dans certains cas.

Des erreurs 404 en pagaille

J'ai fait des modifications importantes de mes permaliens avant les vacance, mais en analysant mes erreurs 404 cette semaine je me suis rendu compte d'une sacré pagaille qui expliquait en partie des baisses de fréquentation.

Comment corriger les redirections après un changement d'URL ?

Avant modifications j'avais des permaliens de la forme /%category%/%post%/ que j'ai remplacé sobrement par /%post%/

Je me suis alors rappelé un bout de script que j’avais partagé ici, qui avec quelques améliorations permettrait de résoudre mon problème.

L'idée est simple : purger tout ce qui ne sert clairement à rien dans une url en 404 et renvoyer ce qui reste au moteur de recherche interne de WordPress.

Redirigez les 404 vers la page vraiment ciblée

Dans mon script d'origine j'affichais les résultats trouvés mais il m'est apparu plus malin d'afficher carrément le 1er post renvoyé par la recherche, avec une belle redirection 301 au cas où Google passerait par là.
Si la recherche ne renvoie rien, je renvoie par contre une page 404 optimisée.

Voici donc le code de ma nouvelle page 404.php avec par flemme des explications en commentaires.
Je suis assez mauvais en expressions régulières et je suis certains que des améliorations sont possible de ce coté, mais ça fait le job, alors …

<?php
// Récupération du slug recherché
$url_404 = urldecode(substr ($_SERVER['REQUEST_URI'], 1));
// Suppression des "déchets"
// Rajoutez ici vos titres d'anciennes catégories, etc.
$junk = array('www', '.html', '.php', '.jpg', '.gif', '.htm', 'wp-content/', 'attachment/', 'feed/', 'category', 'titre', 'categorie', 'rubrique' ,'mon_ancienne_categorie/', 'base_url_de_votre_site');
$url_404 = str_replace($junk, '', $url_404);
// Suppression de tout ce qui suit un ?
$pattern = '/(.*)?(.*)/';
$replacement = '$1';
$url_404 = preg_replace($pattern, $replacement, $url_404, -1 );
// Suppression de tout ce qui précède un 'http://' qui ne serait pas au début de l'URL
$pattern = '/(.*)/http://(.*)/';
$replacement = '$1';
$url_404 = preg_replace($pattern, $replacement, $url_404, -1 );
// Dédoublonnage des termes et remplacement des - et / par +
$url_404 = implode("+", array_unique($explode = explode('-', $url_404)));
// Suppression du / de fermeture
$url_404 = substr($url_404,0,-1);
// On déclenche la recherche
$search_query = new WP_Query();
$search_posts = $search_query->query('s='.$url_404);
// Si la recherche renvoie des résultats on prend le 1er résultat et on fait une redirection 301
if (get_permalink($search_posts[0]->ID)) {
        header('HTTP/1.1 301 Moved Permanently'); 
        header('Location: '.get_permalink($search_posts[0]->ID));
        exit();
} else {
// Sinon on affiche notre page 404
get_header(); ?>
[... le code de votre page 404 ...]
<?php 
// On n'oublie pas de fermer notre boucle conditionnelle 
} ?>

Le code ci-dessus a un défaut important : il va déclencher aussi une recherche sur les images en erreur, ce qui ne troublera pas l'affichage des pages qui les contiennent, mais peut provoquer des pics serveur si on essaie de charger une galerie dont les miniatures n'existent plus.

Ne croyez pas que ça n'arrive jamais : j'ai eu de graves problèmes de surcharge de mon serveur dédié à cause de ça le mois dernier.

Une solution simple et efficace consiste à créer un pixel transparent 1×1.gif, à le placer à la racine de votre site et a rajouter les 3 lignes suivantes au tout début de votre fichier .htaccess

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}  ! -f
RewriteRule .(gif|jpe?g|png|bmp) /1×1.gif [NC,L]

Si vous  n'avez pas ou peu d'erreurs 404 tout ceci ne vous servira pas à grand chose, mais si vous avez mis un gros boxon comme moi …

Important

Cette rustine n'a pas vocation à rester en place pour toujours, car elle consomme pas mal de ressources serveur !

Au bout de quelques mois quand vous estimez que Google a fait la mise à jour de toutes les URL, on vous conseille de la désactiver.

votes
Noter cet article
S’abonner
Notifier de
guest
2 Commentaires
le plus populaire
le plus récent le plus ancien
Inline Feedbacks
View all comments
Ecomiz web
Ecomiz web
1 avril 2016

Bonjour,
merci pour cet article, mais je comprend pas pkoi rediriger une page web qui n’existera plus après la mise à jour, et le réindexation des pages par les moteurs de recherche, ces pages seront automatiquement supprimés de l’index donc supprimés et bien sure les liens qui mènent vers ces pages aussi seront supprimés et modifiés..
Merci