# Ajouter une colonne « nombre de mots » à la liste des articles

> Calculer et afficher une estimation de longueur directement dans le tableau d'administration, en réutilisant le contenu déjà chargé sans requête additionnelle.

- Auteur : Clément Hadrot
- Publié le : 2023-01-05
- Mis à jour le : 2023-01-05
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/colonne-nombre-mots-liste-articles/

## L’essentiel

- str_word_count donne une estimation suffisante pour un usage éditorial
- Le contenu brut doit être débarrassé de ses balises avant comptage
- Aucune requête supplémentaire n'est nécessaire

Une rédactrice en chef d'un site d'actualités locales avait pris l'habitude, avant chaque publication, d'ouvrir chaque brouillon un par un pour vérifier que la longueur restait cohérente avec la ligne éditoriale du média : ni brève expédiée en deux paragraphes, ni pavé de trois mille mots noyant le lecteur. Un travail répétitif qui pouvait pourtant se résumer en une seule colonne dans le tableau des articles.

Ajouter une colonne « nombre de mots » dans l'écran de liste des articles ne demande ni extension ni requête supplémentaire : le contenu de chaque article est déjà chargé en mémoire pour l'affichage de la liste elle-même, il suffit de le compter au bon moment.

## Déclarer la colonne

```
function jr_ajouter_colonne_mots( $colonnes ) {
    $colonnes['nombre_mots'] = 'Longueur';
    return $colonnes;
}
add_filter( 'manage_post_posts_columns', 'jr_ajouter_colonne_mots' );
```

> L'essentiel à retenir : str_word_count donne une estimation suffisante pour un usage éditorial ; Le contenu brut doit être débarrassé de ses balises avant comptage ; Aucune requête supplémentaire n'est nécessaire

## Calculer et afficher la valeur

Le contenu brut d'un article contient des balises HTML, des raccourcis de blocs Gutenberg et des commentaires techniques qui fausseraient un comptage naïf. Il faut d'abord nettoyer ce contenu avant d'appliquer `str_word_count()` :

```
function jr_afficher_colonne_mots( $colonne, $post_id ) {
    if ( 'nombre_mots' !== $colonne ) {
        return;
    }

    $contenu_brut = get_post_field( 'post_content', $post_id );
    $texte_seul   = wp_strip_all_tags( strip_shortcodes( $contenu_brut ) );
    $nombre_mots  = str_word_count( $texte_seul );

    if ( $nombre_mots < 300 ) {
        $couleur = '#d63638'; // trop court
    } elseif ( $nombre_mots > 2500 ) {
        $couleur = '#dba617'; // très long
    } else {
        $couleur = '#00a32a'; // dans la cible
    }

    echo '<span style="color:' . esc_attr( $couleur ) . '; font-weight:600;">' . number_format_i18n( $nombre_mots ) . '</span> mots';
}
add_action( 'manage_post_posts_custom_column', 'jr_afficher_colonne_mots', 10, 2 );
```

Les seuils choisis ici, 300 et 2 500 mots, restent purement indicatifs et méritent d'être ajustés selon la ligne éditoriale réelle du média concerné.

## Rendre la colonne triable

Trier par nombre de mots demande une astuce, puisque cette valeur n'existe pas nativement en base de données : la solution la plus simple consiste à stocker le comptage en meta à chaque sauvegarde, puis à trier sur cette meta plutôt que de recalculer à la volée pour un tri, ce qui serait beaucoup trop coûteux sur une grande table d'articles :

```
function jr_enregistrer_nombre_mots( $post_id, $post ) {
    if ( wp_is_post_revision( $post_id ) ) {
        return;
    }

    $texte_seul = wp_strip_all_tags( strip_shortcodes( $post->post_content ) );
    update_post_meta( $post_id, '_nombre_mots', str_word_count( $texte_seul ) );
}
add_action( 'save_post_post', 'jr_enregistrer_nombre_mots', 10, 2 );

function jr_colonne_triable( $colonnes ) {
    $colonnes['nombre_mots'] = 'nombre_mots';
    return $colonnes;
}
add_filter( 'manage_edit-post_sortable_columns', 'jr_colonne_triable' );

function jr_appliquer_tri_nombre_mots( $query ) {
    if ( ! is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( 'nombre_mots' === $query->get( 'orderby' ) ) {
        $query->set( 'meta_key', '_nombre_mots' );
        $query->set( 'orderby', 'meta_value_num' );
    }
}
add_action( 'pre_get_posts', 'jr_appliquer_tri_nombre_mots' );
```

## Précision de l'estimation

- `str_word_count()` compte les mots séparés par des espaces : un article riche en code source ou en tableaux verra son compte légèrement gonflé artificiellement.
- Cette colonne donne une estimation éditoriale, pas une mesure exacte utilisable pour de la facturation au mot, qui demanderait un traitement bien plus rigoureux.
- Le temps de lecture estimé affiché en front du site repose sur un calcul similaire mais reste un sujet à part, déjà traité séparément pour l'audience publique plutôt que pour l'équipe éditoriale.

> Sur une rédaction avec plusieurs contributeurs, cette colonne visible en un coup d'œil remplace avantageusement des rappels manuels répétés à chaque publication.

## En résumé

Une colonne « nombre de mots », calculée sans requête supplémentaire à partir du contenu déjà chargé, offre un repère éditorial immédiat directement dans la liste des articles. Rendue triable via une meta dédiée, elle devient un outil de suivi éditorial à part entière, distinct du temps de lecture affiché côté visiteur.
