Une page 404 intelligente sous WordPress

Astucedéveloppement

Publié par le , mis à jour le (36863 lectures)

cms wordpress 404

Tutoriel WordPress

L'erreur 404 apparait lorsqu'une ressource est introuvable. C'est une erreur plus ou moins fréquente qui indique simplement que le document recherché n'est plus disponible par l'adresse renseignée dans la barre d'adresse. Cela peut être causé par une erreur d'écriture d'un lien, ou par un déplacement de fichier dont le lien pour y accéder n'aurait pas été mis à jour (soit sur le site, soit sur le moteur de recherche qui n'a pas encore eu le temps de mettre à jour sa base de données).

C'est assez typique des CMS pour lesquels les contenus peuvent beaucoup plus facilement être mis à jour, les pages et articles peuvent très rapidement être renommés ou supprimés, et les fichiers médias déplacés ou supprimés également. Les erreurs 404 sont donc vite arrivées.

WordPress propose dans son template par défaut une page 404.php très basique.
Beaucoup de Webdesigners s'amusent à transformer cette page en un élément graphique original, il y a même des sites spécialisés qui référencent ce type de page sur critère de l'originalité.

En dehors de l'aspect graphique, cette page peut facilement se voir attribuer une fonction d'alerte qui va permettre au webmaster d'être prévenu de son affichage.

Je vous présente un code PHP à placer dans la page 404.php de WordPress, ou à exécuter/afficher sur la condition is_404()

Ce code récupère les informations de navigation de l'utilisateur (url de provenance et url demandée) et envoie un rapport par e-mail au Webmaster. Idéal pour corriger ses erreurs rapidement :)

Voici un code entièrement commenté pour réaliser une telle page. Le reste de la structure est à réaliser par vos soins, bien entendu.

<?php 
	// informations concernant votre site
	$adminemail = get_bloginfo('admin_email'); //le mail du webmaster
	$website = get_bloginfo('url'); //l'url du site
	$websitename = get_bloginfo('name'); // le nom du site
	
	// on commence à composer notre futur paragraphe
	$output_p = '<p>Vous ';

	// si le visiteur a tapé l'adresse manuellement
	if (!isset($_SERVER['HTTP_REFERER'])) :
		$output_p .= 'avez essayé de rejoindre la page ';
		$output_bonux = 'Tout n\'est pas perdu !'; //optionnel

	// si le visiteur a cliqué sur un lien (referer)
	elseif (isset($_SERVER['HTTP_REFERER'])) :
		$output_p .= 'avez cliqué un lien pour rejoindre la page ';

		$failuremess = "Un utilisateur a essayé d'aller à la page $website".$_SERVER['REQUEST_URI']."
et a reçu une erreur 404 (page not found). ";
		$failuremess .= "Il venait de l'url : ".$_SERVER['HTTP_REFERER'];
		
		$headers = 'From: '.$websitename.' <noreply@'.$website.'>'."\r\n";
		$headers .= 'Content-Type: text/html; charset="UTF-8"'."\r\n";

		$mailing = wp_mail($adminemail, "[".$websitename."] 404 : ".$_SERVER['REQUEST_URI'], $failuremess, $headers);
	
		// si le mail est bien envoyé
		if($mailing) : 
			$output_bonux .= "Un administrateur a aussi été prévenu du problème par e-mail. Il fera le nécessaire le plus rapidement possible.";
			
		// s'il ne l'est pas
		else : 
			$output_bonux .= "L'administrateur du site aurait dû être prévenu mais le mail n'a pas pu lui parvenir.<br />";
			$output_bonux .= "Si vous souhaitez lui signaler le problème, merci de copier le message suivant :<br />";
			$output_bonux .= "<code>Referer : ".$_SERVER['HTTP_REFERER']."<br />";
			$output_bonux .= "Request : $website".$_SERVER['REQUEST_URI']."</code> ";
			$output_bonux .= "à l'adresse suivante ".$adminemail;
		endif;
		
	endif;

	// on termine notre paragraphe, 
	// il s'agit de la partie qui apparait de toute manière
	$output_p .= ': <br /><code class="url">'.$website.$_SERVER['REQUEST_URI'].'</code><br />'; 
	$output_p .= ' et elle semble ne pas exister.<br />'; 
	$output_p .= $output_bonux.'<br />'; 
	$output_p .= 'Vous pouvez revenir en arrière et essayer à nouveau, ou effectuer une recherche :</p>'; 
	
	// affichons le texte
	echo $output_p;
	
	// affichons le formulaire de recherche
	get_search_form();
	

	/* 
    // ou avec get_template_part()
    get_template_part('searchform');
    // ou utilisez une fonction "moins wordpress" comme
	include(TEMPLATEPATH . "/searchform.php"); 
	*/ 
?>

Bien entendu ce code est très minimaliste et peut largement être optimisé avec quelques contrôles ou informations supplémentaires.
Il n'est pas destiné uniquement à WordPress puisqu'il vous suffit de remplacer les fonctions prédéfinies (blog_info() ou get_search_form() ou wp_mail()) par vos fonctions/variables personnelles pour l'adapter à un autre type de site web.

J'espère que cette astuce vous servira !

Source originale : Une page 404 utile sous WordPress

Commentaires

Astuce sympathique, mais attention à ne pas rapidement crouler sous les notifications, les robots spammeurs ayant la forte propension à tester des pages volontairement inexistantes (pour déceler des failles de votre site), le volume des mails risquent d'exploser rapidement ;)

Sympa en effet, merci. Peut-être limité le spam par une première détection d'IP, même si cela ne ferait que limiter la portée des robots.

Merci pour vos interventions,
En effet le spam peut-être un problème. Il y a toujours une limite à un système :p

Ce script m'a déjà servi dans un projet un peu tentaculaire lors de la phase de développement pour déceler plus rapidement les petits oublis ou erreurs de chemin, comme ça peut rapidement arriver :p

Dans l'aspect vicieux des tests d'URL pour déceler des failles d'un site, ça a l'avantage d'avoir un côté préventif.

Script améliorable : le mail n'est pas le seul moyen d'être prévenu des erreurs 404, on peut optimiser la chose avec des enregistrements en base de données (avec filtre IP et chemin) et utiliser un cron pour éviter les spams.

Enfin voilà, votre imagination sera votre alliée :)

Je vois un autre problème, spécialement sur les sites à fort trafic : si il manque une ressource qui est appelé une fois ou plus sur chaque page (typiquement un sprit css) cela va générer énormément de "hits 404" et donc une forte charge système.
Cela peut également générer un fort trafic réseau et c'est pourquoi je conseille plutôt d'utiliser une page la plus légère possible (html statique de faible poids).

Sinon à la place du mail, il doit sans doute être possible de logger ces infos et de les afficher dans un panel sur l’accueil de l'admin.

Astuce sympa, je prend note, mais c'est vrai qu'on risque de pas mal se faire spammer, surtout si comme moi vous avez tendance, par mesure de sécurité, à bloquer le /wp-admin et le transformer en /meloguer etc. Beaucoup de bot tentent du /wp-admin sur tous les wordpress, ce qui leur renvoie une jolie 404 (ou la page d'accueil suivant votre htaccess).

En général, je profite aussi de la 404 pour, en plus d'afficher un message sympa et le formulaire de recherche, pour afficher des infos qui pourraient intéresser l'internaute : derniers articles, articles de catégorie, etc. pour qu'il ait des liens utiles même si la page n'existe pas/plus.

Enfin pour détecter les 404 (mais là c'est surtout pour les fichiers manquants par exemple) il existe un petit software bien pratique (pas uniquement pour wordpress) qui s'appelle Xenu : http://home.snafu.de/tilman/xenulink.html. Ne vous fiez pas à la page de présentation du logiciel, il n'est reste pas moins très rapide et efficace pour passer à la moulinette un site en entier et trouver tous les liens morts, internes ou externes.

Plutôt que de prendre le risque de recevoir une plétore de notifications par mail le lien donné par InpIxelItrust semble très intéressant... à tester.