# Adapter la longueur de l’extrait automatique selon le type de contenu affiché

> Une fiche produit et une actualité n'ont pas besoin du même extrait. Voici comment faire varier excerpt_length selon le contexte, sans casser le reste du site.

- Auteur : Clément Hadrot
- Publié le : 2024-01-11
- Mis à jour le : 2024-01-11
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/adapter-longueur-extrait-automatique-type-contenu/

## L’essentiel

- Un seul filtre excerpt_length peut couvrir tous les cas
- Se baser sur get_post_type ou is_singular
- Prévoir une valeur de repli pour les contextes non prévus

Sur un site vitrine qui mélange actualités, fiches produit et pages standards, la question m'a été posée directement par le client : « Pourquoi les résumés des produits sont coupés en plein milieu d'une caractéristique technique, alors que les résumés d'actualité sont bien trop courts ? » La réponse tenait en un seul réglage, universel, appliqué sans distinction à tout le site.

Le filtre `excerpt_length` est justement fait pour ça : il reçoit le nombre de mots par défaut et laisse la main pour le modifier avant que `wp_trim_words()` ne coupe le texte. Le piège classique, c'est de s'arrêter à une seule valeur fixe, alors que le bon réflexe est de conditionner cette valeur au contexte d'affichage.

## Le filtre de base, valeur unique

Voici le point de départ que la plupart des sites utilisent, et qui pose justement le problème évoqué plus haut :

```
add_filter( 'excerpt_length', function () {
    return 30;
} );
```

Trente mots, c'est un compromis correct pour un article de blog classique. C'est nettement trop pour une fiche produit qui liste des caractéristiques techniques précises (on coupe alors en plein milieu d'une donnée utile), et trop long pour une brève d'actualité qui tient naturellement en une phrase.

## Conditionner selon le type de contenu

> L'essentiel à retenir : Un seul filtre excerpt_length peut couvrir tous les cas ; Se baser sur get_post_type ou is_singular ; Prévoir une valeur de repli pour les contextes non prévus

La bonne approche consiste à interroger le type de post en cours dans le filtre lui-même, via `get_post_type()` :

```
add_filter( 'excerpt_length', function ( $longueur ) {
    $type = get_post_type();

    switch ( $type ) {
        case 'produit':
            return 55;
        case 'actualite':
            return 20;
        case 'page':
            return 25;
        default:
            return $longueur;
    }
}, 20 );
```

La priorité `20` plutôt que la valeur par défaut `10` n'est pas anodine : certaines extensions (WooCommerce en tête) posent déjà leur propre filtre sur `excerpt_length` à une priorité standard. En passant après elles, on garde la main sur la décision finale, plutôt que de voir sa valeur écrasée silencieusement.

### Distinguer aussi le contexte d'affichage

Le type de post ne suffit pas toujours : un même type de contenu peut avoir besoin d'un extrait différent selon qu'il apparaît dans une grille d'archive resserrée ou dans un widget de contenus liés en pleine largeur. On peut combiner le type de post avec des conditions d'affichage comme `is_archive()` ou une variable globale posée en amont du template :

```
add_filter( 'excerpt_length', function ( $longueur ) {
    if ( 'produit' === get_post_type() ) {
        return is_archive() ? 18 : 55;
    }

    return $longueur;
}, 20 );
```

Cette distinction évite un défaut courant sur les grilles de produits : des extraits de 55 mots qui font exploser la hauteur des cartes et cassent l'alignement visuel de la grille, alors que la fiche produit elle-même peut se permettre un résumé plus complet.

## Ne pas oublier le point de coupure

La longueur en mots ne règle qu'une partie du problème : le symbole de fin d'extrait par défaut (`[…]`) est lui aussi peu engageant. Le filtre complémentaire est `excerpt_more`, à traiter avec la même logique conditionnelle si on veut un lien « Lire la fiche complète » sur les produits et un simple « (suite) » sur les actualités :

```
add_filter( 'excerpt_more', function ( $plus ) {
    if ( 'produit' === get_post_type() ) {
        return ' …';
    }

    return $plus;
} );
```

## Le cas des extraits manuels

Un point qui surprend souvent : si un rédacteur saisit un extrait manuel dans le champ dédié de l'éditeur, les filtres `excerpt_length` et `excerpt_more` ne s'appliquent pas — WordPress affiche l'extrait tel quel, sans troncature automatique. C'est cohérent (l'auteur a fait un choix éditorial volontaire), mais ça peut surprendre une équipe qui pensait que la limite de mots serait toujours respectée. Pour l'imposer malgré tout, il faut passer par le filtre `get_the_excerpt` et retronquer manuellement avec `wp_trim_words()`, ce qui revient à ignorer la saisie manuelle — une décision à prendre en connaissance de cause, pas par défaut.

- Toujours tester le rendu sur une grille d'archive complète, pas seulement sur un article isolé.
- Vérifier qu'aucune extension active ne pose déjà un filtre concurrent sur `excerpt_length` à une priorité proche.
- Documenter les longueurs choisies par type de contenu dans un commentaire de code : elles sont rarement évidentes six mois plus tard.

> Sur les sites à catalogue, je fixe systématiquement la longueur d'extrait produit en fonction du gabarit de carte le plus étroit du site, pas du plus large : mieux vaut un texte un peu court partout qu'un texte qui déborde sur un seul gabarit.

## Ce qu'il faut retenir

Un extrait n'est pas une donnée neutre : c'est un élément de mise en page à part entière, qui doit s'adapter au gabarit qui l'accueille autant qu'au type de contenu qu'il résume. Le filtre `excerpt_length` combiné à `get_post_type()` et, si besoin, à une condition d'affichage, couvre la quasi-totalité des cas rencontrés sur un site multi-contenus, pour un coût de mise en œuvre minime.
