# Générer un résumé lisible des modifications entre deux révisions d’un article

> Comparer manuellement chaque paragraphe entre deux versions fait perdre un temps précieux. La fonction native wp_text_diff met en évidence les écarts.

- Auteur : Clément Hadrot
- Publié le : 2025-04-23
- Mis à jour le : 2025-04-23
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/generer-resume-modifications-entre-deux-revisions/

## L’essentiel

- wp_text_diff est une fonction native, aucune dépendance externe
- Comparer le contenu, pas seulement le titre
- Afficher le diff dans une métabox dédiée à la relecture

Une coopérative agricole publiait des fiches techniques régulièrement mises à jour par plusieurs relecteurs successifs (agronome, juriste, chargé de communication). Le responsable de publication devait valider chaque révision avant qu'elle ne remplace la version en ligne, mais comparer deux versions d'un texte de plusieurs milliers de mots à l'œil nu, paragraphe par paragraphe, prenait un temps disproportionné par rapport à l'ampleur réelle des changements.

WordPress embarque justement une fonction native pour ce genre de comparaison : `wp_text_diff()`, utilisée en interne par l'écran de comparaison des révisions, mais tout à fait réutilisable dans un contexte personnalisé, sans dépendance à une bibliothèque externe.

## Comprendre wp_text_diff

Cette fonction prend en paramètres deux chaînes de texte à comparer et un tableau d'arguments optionnels, et renvoie un tableau HTML mettant en évidence les segments ajoutés, supprimés ou inchangés :

```
$diff_html = wp_text_diff( $texte_gauche, $texte_droit, array(
    'title'  => 'Comparaison des deux dernières révisions',
    'title_left'  => 'Version précédente',
    'title_right' => 'Version actuelle',
) );

if ( $diff_html ) {
    echo $diff_html;
} else {
    echo '<p>Aucune différence détectée entre les deux versions.</p>';
}
```

Un point à connaître : `wp_text_diff()` renvoie une chaîne vide (donc « falsy ») quand les deux textes sont strictement identiques, ce qui permet de gérer proprement ce cas sans avoir à comparer les chaînes soi-même au préalable.

## Récupérer les deux révisions à comparer

> L'essentiel à retenir : wp_text_diff est une fonction native, aucune dépendance externe ; Comparer le contenu, pas seulement le titre ; Afficher le diff dans une métabox dédiée à la relecture

La fonction `wp_get_post_revisions()` renvoie la liste des révisions d'un article, classées de la plus récente à la plus ancienne. Pour comparer la version actuellement publiée à la révision juste avant elle :

```
function cooperative_afficher_diff_derniere_revision( WP_Post $post ) {
    $revisions = wp_get_post_revisions( $post->ID, array( 'posts_per_page' => 2 ) );

    if ( count( $revisions ) < 2 ) {
        echo '<p>Pas assez de révisions pour établir une comparaison.</p>';
        return;
    }

    $revisions = array_values( $revisions );
    $recente   = $revisions[0];
    $precedente = $revisions[1];

    echo wp_text_diff( $precedente->post_content, $recente->post_content, array(
        'title_left'  => 'Version du ' . get_the_modified_date( 'd/m/Y à H:i', $precedente ),
        'title_right' => 'Version du ' . get_the_modified_date( 'd/m/Y à H:i', $recente ),
    ) );
}
```

### Intégrer ce résumé dans une métabox de relecture

```
add_action( 'add_meta_boxes', function () {
    add_meta_box(
        'cooperative_diff_revisions',
        'Résumé des dernières modifications',
        function ( WP_Post $post ) {
            cooperative_afficher_diff_derniere_revision( $post );
        },
        'fiche_technique',
        'normal',
        'high'
    );
} );
```

Placer cette métabox en position `high` dans la colonne principale, juste sous le titre, la rend visible dès l'ouverture de l'écran d'édition, sans que le relecteur ait besoin de faire défiler la page pour la trouver.

## Résumer uniquement le corps, pas la mise en forme des blocs

Un piège fréquent avec les contenus rédigés dans l'éditeur de blocs : le champ `post_content` contient les commentaires de délimitation des blocs (`<!-- wp:paragraph -->`), qui apparaissent alors dans le diff comme des « changements » même quand seul le texte visible a évolué de façon marginale, à cause d'un simple réordonnancement de blocs sans changement de fond. Pour un résumé plus lisible, on peut passer le contenu rendu (`apply_filters( 'the_content', $post->post_content )`) plutôt que le contenu brut, au prix de perdre la distinction fine entre les blocs :

```
$gauche = wp_strip_all_tags( apply_filters( 'the_content', $precedente->post_content ) );
$droite = wp_strip_all_tags( apply_filters( 'the_content', $recente->post_content ) );

echo wp_text_diff( $gauche, $droite );
```

Ce compromis convient bien à un usage de relecture éditoriale, où l'on veut voir ce qui a changé dans le texte final tel qu'il apparaîtra au lecteur, plutôt que dans la structure technique des blocs.

## Comparer deux révisions au choix, pas seulement les deux dernières

Pour un usage plus flexible, un sélecteur simple (deux menus déroulants listant les révisions disponibles avec leur date) permet au relecteur de choisir n'importe quelle paire à comparer, pas seulement les deux dernières en date. Les deux identifiants sélectionnés sont alors transmis via des paramètres `GET`, récupérés puis validés côté serveur avant l'appel à `wp_text_diff()`.

- Vérifiez toujours que les deux révisions appartiennent bien au même article avant de les comparer, pour éviter une comparaison absurde entre deux contenus sans rapport.
- N'oubliez pas `current_user_can( 'edit_post', $post->ID )` avant d'afficher un contenu de révision, celui-ci pouvant contenir des informations non encore publiées.
- Testez le rendu avec un article qui n'a qu'une seule révision (cas d'un tout nouvel article) pour vérifier que le message de repli s'affiche correctement.

> Un conseil qui vaut pour toute fonctionnalité de relecture éditoriale : privilégier une fonction native déjà éprouvée par le cœur de WordPress plutôt qu'une bibliothèque de diff externe, dont la maintenance à long terme n'est jamais garantie sur un projet WordPress.

## Dans la pratique

`wp_text_diff()` reste sous-utilisée en dehors de l'écran natif de comparaison des révisions, alors qu'elle se prête très bien à des cas d'usage éditoriaux personnalisés comme celui-ci. Le gain de temps pour une équipe de relecture qui traite plusieurs révisions par semaine justifie largement les quelques lignes nécessaires à son intégration dans une métabox dédiée.
