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 the_excerpt() 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 substr().
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 !

Cet article a été publié dans WordPress par . Mettez-le en favori avec son permalien.
  • L’ami bruno dit merci

  • Mais de rien 😀

  • francoise

    bonjour
    merci pour ce code qui correspond exactement à mon besoin.
    Malheureusement ça ne fonctionne pas pour moi.
    j’ai pourtant bien copié le code dans le fichier function de mon thème
    mais aucun trace des extraits ni dans mes pages ni dans ma base de donnée.
    Quelqu’un peut il m’aider???

  • Bonjour Françoise.
    Ce code n’est pas rétroactif et ne s’appliquera que lors de la sauvegarde d’un nouvel article (ou la modification d’un article existant, à priori).
    Le problème vient-il de là ?

  • Françoise

    Et bien non car j’ai effectivement créé de nouveau articles ainsi que mise à jours certains et rien n’y fait !!!!! 🙁
    Je ne comprends pas ….

  • J’avoue que je ne comprends pas le problème. Assurez-vous d’avoir inséré ce code dans le fichier functions.php du thème utilisé et de ne pas avoir fait d’erreur dans l’implémentation.