# Longueur et lien « Lire la suite » des extraits : les filtres qui comptent

> 55 mots par défaut, un « […] » sans lien : l'extrait natif de WordPress déçoit souvent. Trois filtres suffisent à le rendre présentable.

- Auteur : Clément Hadrot
- Publié le : 2020-05-18
- Mis à jour le : 2020-05-18
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/filtres-longueur-lien-extraits/

## L’essentiel

- excerpt_length change le nombre de mots
- excerpt_more personnalise le lien
- wp_trim_words gère les extraits manquants

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 `&hellip;` ou `[…]` selon la version) et permet de la remplacer par n'importe quel balisage, y compris un lien vers l'article.

> L'essentiel à retenir : excerpt_length change le nombre de mots ; excerpt_more personnalise le lien ; wp_trim_words gère les extraits manquants

```
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_length` mots, complété par `excerpt_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.
