vendredi 25 septembre 2026

À propos

Contact

IA & MCP

Générer des résumés d’articles automatiquement avec un LLM

Un hook de publication qui appelle un modèle de langage, stocke le résumé en meta, régénère à la modification et laisse toujours la main au contrôle humain.

Par Clément Hadrot • 27 octobre 2023 • 4 min de lecture • Aucun commentaire
Générer des résumés d'articles automatiquement avec un LLM

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 ) );
    }
} );
L'essentiel à retenir : Déclenché sur transition_post_status ; Résumé stocké en meta, jamais dans le contenu ; Régénération sur modification substantielle

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.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi