Par défaut, the_excerpt() affiche 55 mots suivis d’un discret « […] » sans le moindre lien cliquable. C’est fonctionnel, mais rarement ce qu’attend un client : la plupart veulent un extrait plus court sur la page d’accueil, et surtout un vrai bouton « Lire la suite » qui pointe vers l’article.
Trois filtres du cœur de WordPress permettent de reprendre la main sans toucher au thème en profondeur : excerpt_length, excerpt_more, et la fonction wp_trim_words() pour les cas où l’on construit son propre extrait à la main. Voici comment les combiner.
Changer le nombre de mots avec excerpt_length
Le filtre excerpt_length reçoit le nombre de mots par défaut (55) et doit retourner le nombre souhaité. Il s’applique uniquement quand l’extrait est généré automatiquement à partir du contenu, pas quand l’auteur a saisi un extrait manuel.
function projet_longueur_extrait( $longueur ) {
return 25;
}
add_filter( 'excerpt_length', 'projet_longueur_extrait', 999 );
La priorité élevée (999) n’est pas cosmétique : un thème ou une extension peut déjà avoir accroché ce filtre avec la priorité par défaut de 10, et le dernier filtre exécuté l’emporte. Sur un projet récent, un thème enfant fixait la longueur à 40 mots ; sans priorité forcée, mon filtre à 25 mots était tout simplement ignoré.
Remplacer le « […] » par un vrai lien
Le filtre excerpt_more reçoit la chaîne par défaut (généralement … ou […] selon la version) et permet de la remplacer par n’importe quel balisage, y compris un lien vers l’article.

function projet_lien_lire_la_suite( $more ) {
return sprintf(
' <a class="lire-la-suite" href="%s">Lire la suite</a>',
esc_url( get_permalink() )
);
}
add_filter( 'excerpt_more', 'projet_lien_lire_la_suite' );
Attention à un piège classique : ce filtre s’applique uniquement dans la boucle (in_the_loop()), sinon get_permalink() peut retourner une URL incorrecte si la fonction est appelée hors contexte, par exemple dans un widget mal placé.
La différence entre extrait manuel et extrait automatique
Un piège fréquent : un rédacteur remplit le champ « Extrait » dans l’écran d’édition, et son texte n’est jamais tronqué ni complété par le lien ajouté via excerpt_more. C’est normal : ce filtre ne s’applique qu’aux extraits générés automatiquement depuis post_content. Pour un extrait manuel, WordPress restitue le texte tel quel, sans troncature ni ajout.
- Extrait automatique : généré à partir du contenu, tronqué à
excerpt_lengthmots, complété parexcerpt_more. - Extrait manuel : texte saisi dans le champ dédié, affiché tel quel par
the_excerpt(), aucun filtre de longueur appliqué.
Pour uniformiser l’affichage quel que soit le cas, la solution consiste à construire soi-même l’extrait avec wp_trim_words() plutôt que de compter sur the_excerpt().
Construire un extrait maison avec wp_trim_words
La fonction wp_trim_words( $texte, $nombre_de_mots, $suite ) tronque n’importe quelle chaîne à un nombre de mots donné. Elle est pratique pour forcer la même longueur, que l’article ait un extrait manuel ou non.
function projet_extrait_uniforme( $longueur = 20 ) {
$texte = get_the_excerpt();
return wp_trim_words( $texte, $longueur, '…' );
}
Dans le fichier de template, on remplace alors the_excerpt(); par echo projet_extrait_uniforme();, ce qui garantit une longueur constante sur la page d’accueil, quel que soit ce que les rédacteurs ont saisi.
Cas particulier des templates de blocs
Sur un thème utilisant des templates de blocs avec le bloc « Extrait », les filtres excerpt_length et excerpt_more continuent de fonctionner puisque le bloc s’appuie en interne sur the_excerpt(). En revanche, il ne propose pas de réglage pour le nombre de mots dans son panneau ; il faut donc toujours passer par PHP pour ce niveau de contrôle fin.
Sur les projets où le client change souvent la longueur voulue, j’expose ce nombre de mots via un filtre nommé, plutôt qu’une valeur codée en dur, pour pouvoir le surcharger depuis un thème enfant sans toucher au plugin principal.
En résumé
Trois leviers couvrent la quasi-totalité des besoins : excerpt_length pour la longueur, excerpt_more pour le lien de fin, et wp_trim_words() quand on veut un contrôle total indépendant de la présence d’un extrait manuel. Ensemble, ils transforment un extrait générique en élément d’interface cohérent avec le reste du site.