Diije

Générer un extrait automatique pour chaque article

L’extrait dans WordPress est un court résumé du texte que l’on peut afficher à différents endroits du thème, notamment pour éviter que le contenu entier du texte ne soit dupliqué sur la page d’accueil, la page de l’article, les pages d’archives, de catégories, de tags …

Si la fonction native de WordPress <a href="http://codex.wordpress.org/Function_Reference/the_excerpt">the_excerpt()</a> permet d’afficher l’extrait configuré dans l’interface d’administration, ou à défaut les 55 premiers mots de l’article (en retirant les éventuelles balises de code source), ce comportement n’est pas toujours adapté à nos usages.

Suite à la demande de l’ami Bruno Hug, je vous propose une petite fonction à placer dans le fichier functions.php de votre thème, pour personnaliser quelque peu le comportement de WordPress concernant l’extrait.

add_action( 'save_post', 'dfr_custom_excerpt', 10, 1);
function dfr_custom_excerpt($post_id) {
	//récupération de l'extrait et du contenu du post
	global $wpdb;
	$sql = "SELECT post_content,post_excerpt FROM ".$wpdb->prefix."posts WHERE ID = ".$post_id;
	$result = $wpdb->get_row($sql);

	//si un extrait existe
	if($result->post_excerpt) {
		//on en retire le code et on ne garde que les 150 premiers caractères
		$extrait = substr(wp_strip_all_tags($result->post_excerpt),0,150);
		//on met à jour la base de données
		$wpdb->update($wpdb->prefix."posts",
			array('post_excerpt'=>$extrait), 
			array('post_id'=>$post_id)
		);
	}
	//sinon on utilise le contenu
	else {
		//on supprime les tags HTML et on prend les 150 premiers caractères
		$extrait = substr(wp_strip_all_tags($result->post_content),0,150);	
		$wpdb->update($wpdb->prefix."posts", 
			array('post_excerpt'=>$extrait), 
			array('post_id'=>$post_id)
		);
	}
}

Le fonctionnement est très simple : quand un article est sur le point d’être sauvegardé en base de données, le filtre save_post est déclenché, et notre fonction s’exécute :

add_action( 'save_post', 'dfr_custom_excerpt', 10, 1);

Cette ligne permet également de définir un ordre de priorité pour l’exécution de notre fonction (le 3e argument, laissé ici à la valeur par défaut : 10) et de spécifier quand c’est possible le nombre d’argument que notre fonction accepte (ici 1, référez-vous au Codex WordPress pour savoir quelles actions permettent le passage d’arguments). L’argument en question sera ici l’ID de l’article.

On se sert ensuite de la variable globale $wpdb qui permet les accès à la base de données pour récupérer l’extrait et le contenu du post. Ensuite, si un extrait a été configuré par l’utilisateur, on en supprime purement et simplement tout le code HTML, JavaScript, CSS, PHP … de la même manière qu’on l’a fait pour supprimer le HTML dans les commentaires ou dans les titres. On en profite pour en réduire la longueur à 150 caractères à l’aide de la fonction PHP <a href="http://php.net/manual/fr/function.substr.php">substr()</a>.
Si aucun extrait n’a été rédigé, on appliquera le même traitement aux 150 premiers caractères de l’article. Enfin l’extrait sera sauvegardé en base de données.

De cette manière, vous êtes certains d’avoir toujours un extrait formaté de la même manière à afficher dans vos pages. N’hésitez pas à personnaliser cette fonction pour l’adapter à vos besoins !