Comment rediriger automatiquement les pages 404 en erreur vers les bons articles sur WordPress ?

La plupart des thèmes WordPress comportent une page d’erreur 404 personnalisée. Si ce n’est pas le cas du thème que vous utilisez, je vous conseille d’en créer une sous la forme d’un template 404.php.

Vous pouvez l’agrémenter d’une image originale et pourquoi pas de la liste de vos meilleurs articles, mais pourquoi en rester là ? En effet si l’utilisateur cherche un contenu et ne le trouve pas, autant le guider vers ce qu’il cherche, mais comment procéder pour cela ?

Comment rediriger automatiquement les pages 404 en erreur vers les bons articles sur WordPress ?

Une solution consiste à analyser l’adresse saisie par l’utilisateur, à en extraire les mots clefs puis à les réinjecter dans le moteur de recherche de WordPress.
Regardons ce que j’ai mis dans mon fichier 404.php :

Récupérer l’adresse saisie après le nom de domaine

$search_terms = urldecode(substr($_SERVER['REQUEST_URI'], 1));

Saisissons pour notre exemple l’URL suivante : https://creerunblog.net/rubrique/jeux/j-aime-les-jeux-video.htm on a donc :

$search_terms = /rubrique/jeux/j-aime-les-jeux-video.htm

Eliminer les termes inutiles

Dans l’adresse saisie il y a peut-être des termes qui ne servent à rien du tout, comme une extension « jpg » ou encore un « www » qui ne donnent pas tellement d’indication sur le type de contenu recherché :

/* Elimination des termes inutile */
$order = array('www', '.html', '.php', '.jpg', '.gif', 'tag', 'category', '.htm', 'titre', 'categorie', 'rubrique' );
$replace = '';
$search_terms = str_replace($order, $replace, $search_terms);

Pareil pour les « . » « – » et autres ponctuations :

/* remplacement des ponctuations */
$order = array(' ', '/', '_', '-', '.');
$replace = '+';
$search_terms = str_replace($order, $replace, $search_terms);

Vous remarquez qu’on a au passage remplacé toutes les ponctuations par des + ce qui nous donne :

$search_terms = jeux+j+aime+les+jeux+video

Supprimer les termes trop courts et les doublons

Comme vous l’avez compris on va utiliser cette chaine simplifiée pour faire une recherche. Du coup les éléments composés d’un ou deux caractères seulement risquent de polluer pas mal notre recherche et il vaut mieux les éliminer.

Nous allons passer par un tableau intermédiaire et en profiter pour supprimer aussi les doublons :

/* suppression des termes courts et des doublons */
$search_array = array_unique(explode("+", $search_terms));
foreach($search_array as $key => $value){
        if (strlen($value)<3) {
                unset ($search_array[$key]);
        }
}
$search_terms = implode("+",$search_array);

$args = array( 
        'numberposts' => 1,
        's' => $search_terms
);
$404_query = new WP_Query($args);
if( $404_query->have_posts()) : while( $404_query->have_posts() ) : $404_query->the_post();
        $404_permalink = the_permalink(); 
endwhile; endif; 
wp_reset_postdata();

if ($404_permalink) {
        wp_redirect( $404_permalink, 301);
}

Le fichier 404.php complet

Si on met tout bout à bout, voici ce que vous devez intégrer au tout début de votre fichier 404.php avant tous les éléments de la page 404 définie par votre thème :

$search_terms = urldecode(substr($_SERVER['REQUEST_URI'], 1));

/* Elimination des termes inutile */
$order = array('www', '.html', '.php', '.jpg', '.gif', 'tag', 'category', '.htm', 'titre', 'categorie', 'rubrique' );
$replace = '';
$search_terms = str_replace($order, $replace, $search_terms);

/* remplacement des ponctuations */
$order = array(' ', '/', '_', '-', '.');
$replace = '+';
$search_terms = str_replace($order, $replace, $search_terms);

/* suppression des termes courts et des doublons */
$search_array = array_unique(explode("+", $search_terms));
foreach($search_array as $key => $value){
        if (strlen($value)<3) {
                unset ($search_array[$key]);
        }
}
$search_terms = implode("+",$search_array);

$args = array( 
        'numberposts' => 1,
        's' => $search_terms
);
$404_query = new WP_Query($args);
if( $404_query->have_posts()) : while( $404_query->have_posts() ) : $404_query->the_post();
        $404_permalink = the_permalink(); 
endwhile; endif; 
wp_reset_postdata();

if ($404_permalink) {
        wp_redirect( $404_permalink, 301);
}

Bien évidemment ceci n’est qu’une trame, et je vous invite à adapter ce code à vos besoin spécifiques.

Mise en garde

Comment rediriger automatiquement les pages 404 en erreur vers les bons articles sur WordPress ? #2

Un conséquence de l’implémentation de ce script est que la majorité de vos 404 n’apparaitront plus dans la Google Search Console. Ce mécanisme n’est pas « propre » dans le sens ou il va masquer ces 404 au lieu de les corriger et générer de la charge du coté de votre serveur en sollicitant pas mal la base de données.

On vous conseille donc d’installer un plug-in comme Redirections pour monitorer ce qui se passe afin d’appliquer de vraies redirections propres ou votre site risque de ralentir, en particulier si Google le crawle dans son ensemble et tombe sur des milliers de 404 en quelques minutes…

Il existe des plugins WordPress qui font déjà tout ça

Comment rediriger automatiquement les pages 404 en erreur vers les bons articles sur WordPress ? #3

On a porté à ma connaissance qu’il existait déjà des plug-ins qui faisaient tout ça comme des grands comme :

Je ne les ai pas testés car ma version maison du script ci-dessus est customisée selon mes besoins (et elle est nettement plus complexe que le code détaillé ci-dessus). Je suis curieux en revanche d’avoir vos retours sur ces autres plugins dans les commentaires.

votes
Noter cet article
S’abonner
Notifier de
guest
5 Commentaires
le plus populaire
le plus récent le plus ancien
Inline Feedbacks
View all comments
Tony
Tony
28 septembre 2010

Salut. C'est une bonne idée ce qui viens d'être proposé ici, je n'y avais jamais songé. Sinon il y a deux solutions alternatives:

1) Le plugin WordPress "smart 404"

2) Une solution que j'ai mis au point (je termine un outil que je donnerais au grand public) qui utilise un algorithme pour trouver une URL semblable. L'avantage c'est que c'est super performant pour les petites erreur dans l'URL (exemple: faute de frappe) et que ce n'est pas limité à WordPress. L'inconvénient c'est que ça donne des résultats moyens dans certains cas. Pour en savoir plus, voici un article qui détail ma technique: http://tonyarchambeau.com/blog/gestion-de-site-we

romain
romain
10 janvier 2013

Bonjour,
y a -t-il un moyen de gérer soi même les erreurs 404 avec un fichier htaccess plutôt que de laisser wordpress le faire avec les permaliens ?

Cédric
Cédric
28 janvier 2013

Je recommande le plugin « smart 404 » couplé au plugin redirections pour tout traiter directement en back office.

Charlotte - Le Labo du Rédacteur Web
Charlotte - Le Labo du Rédacteur Web
23 juin 2021

Très chouette article ! La redirection est une super idée pour réorienter les lecteurs au lieu de simplement leur dire de revenir en arrière 🙂
De mon côté, j’utilise le plugin 404 to 301, dont je suis plutôt satisfaite. J’ai même placé mon formulaire de capture sur cette page, qui a un très bon taux de conversion 😉