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.
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 …
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 ...]
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.
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
Il y a d’une part les moteurs de recherche mais aussi tous les backlinks
D’une part il n’est pas garanti que Google réindexe aussi bien la page après son changement d’URL sans un coup de main et d’autre part cette méthode permet de conserver ses backlinks (cliquables et pris en compte pour le SEO)