Un site d’actualités régionales nous a demandé un moyen d’afficher un résumé homogène sous chaque article sur sa page d’accueil, sans dépendre de la discipline inégale des journalistes à remplir le champ d’extrait manuel. La solution retenue génère automatiquement un résumé à la publication, tout en laissant toujours la possibilité de le modifier ou de le régénérer.
Ce tutoriel ne traite pas la génération d’articles complets par IA, une question distincte et plus sensible éditorialement : il se limite à la production d’un résumé court à partir d’un contenu déjà rédigé par une personne.
Choisir le bon hook de déclenchement
Le hook save_post se déclenche à chaque enregistrement, y compris les sauvegardes automatiques et les révisions, ce qui multiplierait inutilement les appels à l’API. Nous avons préféré transition_post_status, qui permet de cibler précisément le moment où un article passe au statut publié, et d’ignorer les statuts de brouillon.
add_action( 'transition_post_status', function ( $nouveau_statut, $ancien_statut, $post ) {
if ( 'publish' !== $nouveau_statut || 'publish' === $ancien_statut ) {
return;
}
if ( 'post' !== $post->post_type ) {
return;
}
wp_schedule_single_event( time() + 2, 'wpm_generer_resume', array( $post->ID ) );
}, 10, 3 );
La condition 'publish' === $ancien_statut exclut les republications d’un article déjà publié, pour ne déclencher la génération qu’à la toute première publication.
Construire le prompt et appeler le modèle
Le prompt fixe une longueur cible précise, en mots plutôt qu’en caractères, pour un résultat plus stable d’un article à l’autre. Le contenu est nettoyé de ses balises HTML avant d’être transmis, afin de ne pas gaspiller de tokens sur du balisage inutile au résumé.
add_action( 'wpm_generer_resume', function ( $post_id ) {
$contenu = wp_strip_all_tags( get_post_field( 'post_content', $post_id ) );
$reponse = wp_remote_post( 'https://api.openai.com/v1/chat/completions', array(
'timeout' => 20,
'headers' => array(
'Authorization' => 'Bearer ' . WPM_LLM_API_KEY,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( array(
'model' => 'gpt-4o-mini',
'messages' => array(
array(
'role' => 'system',
'content' => 'Résume le texte fourni en 60 mots maximum, ton neutre et factuel, sans reprendre la première phrase de l\'article.',
),
array( 'role' => 'user', 'content' => $contenu ),
),
) ),
) );
if ( is_wp_error( $reponse ) ) {
return;
}
$corps = json_decode( wp_remote_retrieve_body( $reponse ), true );
$resume = $corps['choices'][0]['message']['content'] ?? '';
if ( $resume ) {
update_post_meta( $post_id, '_wpm_resume_ia', sanitize_textarea_field( $resume ) );
update_post_meta( $post_id, '_wpm_resume_hash', md5( $contenu ) );
}
} );

Stocker en meta, jamais fusionner dans le contenu
Le résumé est délibérément stocké dans une métadonnée séparée, _wpm_resume_ia, et non inséré directement dans le champ d’extrait natif de WordPress ni dans le contenu de l’article. Cette séparation garde une trace claire de ce qui a été généré automatiquement, et permet à tout moment de basculer vers un extrait rédigé manuellement sans perdre l’historique.
Régénérer uniquement si le contenu a réellement changé
Republier un résumé à chaque modification mineure, comme une correction typographique, gaspillerait des appels API sans réel bénéfice. Le hash du contenu stocké au moment de la génération permet de comparer et de ne redéclencher un résumé que si le texte a changé de façon substantielle.
add_action( 'save_post', function ( $post_id ) {
if ( 'publish' !== get_post_status( $post_id ) ) {
return;
}
$contenu_actuel = wp_strip_all_tags( get_post_field( 'post_content', $post_id ) );
$hash_stocke = get_post_meta( $post_id, '_wpm_resume_hash', true );
if ( md5( $contenu_actuel ) !== $hash_stocke ) {
wp_schedule_single_event( time() + 2, 'wpm_generer_resume', array( $post_id ) );
}
} );
Le contrôle humain reste la dernière étape
Dans l’éditeur, le résumé généré s’affiche dans un champ modifiable du panneau latéral, jamais en lecture seule. Un journaliste qui trouve le résumé imprécis peut le corriger directement, sans que cette correction manuelle ne soit écrasée par une régénération ultérieure : on ajoute pour cela un indicateur _wpm_resume_modifie_manuellement qui désactive la régénération automatique une fois ce champ modifié à la main.
En résumé
Un système de résumé automatique fiable repose sur trois choix simples : un hook de déclenchement précis pour éviter les appels inutiles, un stockage séparé du contenu original, et une régénération conditionnée à un changement réel du texte plutôt qu’à chaque sauvegarde.