Un blog de recettes de cuisine que j’ai repris comptait une bonne dizaine d’extensions installées, dont une uniquement pour afficher « 4 min de lecture » en haut de chaque article. Cette fonctionnalité, à première vue anodine, chargeait pourtant son propre fichier CSS et JS sur chaque page. Le calcul qu’elle effectuait tenait pourtant en une dizaine de lignes de PHP, sans dépendance externe.
Voici comment reproduire ce calcul proprement, avec une mise en cache pour ne pas recompter les mots à chaque chargement de page.
Calculer le temps de lecture
Le principe : nettoyer le contenu de ses balises HTML et shortcodes, compter les mots, puis diviser par une vitesse de lecture moyenne, généralement estimée entre 200 et 250 mots par minute pour un adulte lisant du français courant.
function calculer_temps_lecture( $post_id ) {
$contenu = get_post_field( 'post_content', $post_id );
$contenu = strip_shortcodes( $contenu );
$contenu = wp_strip_all_tags( $contenu );
$nombre_mots = str_word_count( $contenu );
$mots_par_minute = 200;
$minutes = (int) ceil( $nombre_mots / $mots_par_minute );
return max( 1, $minutes );
}
La fonction native str_word_count() de PHP reste approximative sur du texte contenant des mots composés ou des caractères accentués mal reconnus selon la configuration de locale du serveur ; pour un comptage plus fiable, un simple preg_split( '/\s+/u', trim( $contenu ) ) compte les segments séparés par des espaces, ce qui est suffisant pour une estimation.
Mettre le résultat en cache dans une meta
Recalculer ce chiffre à chaque affichage de page revient à parcourir l’intégralité du contenu à chaque visite, un gaspillage inutile. On enregistre plutôt le résultat dans une meta, recalculée uniquement lors de l’enregistrement de l’article :

add_action( 'save_post_post', function ( $post_id ) {
if ( wp_is_post_revision( $post_id ) || defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
$minutes = calculer_temps_lecture( $post_id );
update_post_meta( $post_id, '_temps_lecture_minutes', $minutes );
} );
function obtenir_temps_lecture( $post_id ) {
$minutes = get_post_meta( $post_id, '_temps_lecture_minutes', true );
if ( '' === $minutes ) {
$minutes = calculer_temps_lecture( $post_id );
update_post_meta( $post_id, '_temps_lecture_minutes', $minutes );
}
return (int) $minutes;
}
Afficher le résultat dans le thème
L’affichage se résume ensuite à un appel simple dans le fichier de template, par exemple juste après le titre de l’article :
<p class="temps-lecture">
<?php
printf(
esc_html( _n( '%d minute de lecture', '%d minutes de lecture', obtenir_temps_lecture( get_the_ID() ), 'mon-theme' ) ),
obtenir_temps_lecture( get_the_ID() )
);
?>
</p>
L’intégrer comme un bloc plutôt qu’en dur dans le template
Pour un site utilisant l’éditeur de site (FSE) et un thème basé sur theme.json, il est possible d’aller plus loin en créant un petit bloc dynamique dont le rendu appelle obtenir_temps_lecture(), ce qui permet aux rédacteurs de le positionner librement dans leurs modèles plutôt que de le figer dans le code du thème.
- Un bloc dynamique s’enregistre avec
register_block_type()et un fichierrender.phpqui appelle la fonction de calcul. - Cette approche évite de dupliquer la logique d’affichage dans plusieurs fichiers de template.
- Elle reste compatible avec un affichage conditionnel selon le type de contenu.
Avant d’installer une extension pour une fonctionnalité d’une dizaine de lignes de PHP, je vérifie toujours si le calcul ne peut pas simplement vivre dans une extension maison légère, sans dépendance ni fichier CSS superflu.
En résumé
Un temps de lecture estimé n’a rien de sorcier : un comptage de mots, une division, une mise en cache en meta pour ne pas recalculer à chaque affichage. Cette approche évite une extension complète pour un résultat identique, tout en restant entièrement personnalisable dans son affichage et son message.