# Suggérer catégories et étiquettes par IA dans l’éditeur WordPress

> Proposer une classification automatique du contenu dans Gutenberg, avec validation humaine et respect strict de la taxonomie existante du site.

- Auteur : Clément Hadrot
- Publié le : 2023-03-06
- Mis à jour le : 2023-03-06
- Catégorie : IA &amp; MCP
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ia-mcp/suggerer-categories-etiquettes-ia-editeur/

## L’essentiel

- Suggestion, jamais publication automatique
- On respecte les termes existants
- Un seul appel par sauvegarde

Un client éditorial nous a posé la question un matin de mars, après avoir vu un concurrent afficher « catégorisation automatique par IA » sur sa page de fonctionnalités : peut-on faire pareil sur un site qui publie une trentaine d'articles par semaine, rédigés par cinq personnes qui n'utilisent jamais les mêmes mots pour désigner la même rubrique ?

La réponse tient en une contrainte simple, que nous avons posée avant d'écrire la moindre ligne de PHP : l'IA propose, le rédacteur décide. Voici comment nous avons construit ce module de suggestion, brique par brique, dans l'éditeur de blocs.

## Le problème que l'automatisation totale ne résout pas

Classer un article ne consiste pas seulement à repérer des mots-clés. Il faut aussi respecter une hiérarchie de catégories déjà en place, éviter de créer des doublons proches (« Marketing digital » à côté de « Marketing numérique »), et tenir compte de règles éditoriales tacites que seule une personne de la rédaction connaît. Confier cette décision entièrement à un modèle de langage revient à accepter un risque de dérive de la taxonomie au fil des mois.

Nous avons donc écarté d'emblée l'idée d'un classement automatique en tâche de fond à la publication. Le module s'active uniquement à la demande du rédacteur, depuis un panneau latéral de l'éditeur.

## Récupérer la taxonomie existante avant d'interroger le modèle

La première étape ne concerne pas l'IA du tout : il s'agit d'extraire la liste des catégories et étiquettes déjà utilisées sur le site, pour la transmettre au modèle comme contrainte. Sans cela, le modèle invente des libellés plausibles mais absents de la base.

```
function wpm_get_taxonomy_snapshot() {
    $categories = get_terms( array(
        'taxonomy'   => 'category',
        'hide_empty' => false,
        'fields'     => 'names',
    ) );

    $tags = get_terms( array(
        'taxonomy'   => 'post_tag',
        'hide_empty' => false,
        'fields'     => 'names',
        'number'     => 200,
    ) );

    return array(
        'categories' => $categories,
        'tags'       => $tags,
    );
}
```

Cette liste est injectée dans le prompt système envoyé au modèle, avec une instruction explicite : ne proposer que des termes présents dans cette liste, sauf si le rédacteur active une case « autoriser de nouveaux termes ».

> L'essentiel à retenir : Suggestion, jamais publication automatique ; On respecte les termes existants ; Un seul appel par sauvegarde

## Une route REST dédiée, appelée depuis le panneau latéral

Le bloc côté client n'appelle jamais directement l'API du fournisseur de LLM : la clé resterait exposée dans le navigateur. On passe par une route REST WordPress qui fait office de proxy contrôlé.

```
add_action( 'rest_api_init', function () {
    register_rest_route( 'wpm/v1', '/classify', array(
        'methods'             => 'POST',
        'permission_callback' => function () {
            return current_user_can( 'edit_posts' );
        },
        'callback'            => 'wpm_classify_post_content',
    ) );
} );
```

Le callback récupère le contenu de l'article en cours d'édition, construit le prompt avec la taxonomie existante, appelle l'API du modèle via `wp_remote_post()`, puis renvoie une réponse structurée avec au maximum trois catégories candidates et cinq étiquettes candidates, chacune accompagnée d'un score de confiance.

## L'interface de validation, pas d'automatisme caché

Côté éditeur, le panneau affiche les suggestions sous forme de cases à cocher, jamais pré-cochées. Le rédacteur sélectionne ce qu'il retient, et seul un clic sur « Appliquer » modifie réellement les métadonnées de l'article via l'API des blocs.

- Aucune catégorie n'est ajoutée sans clic explicite du rédacteur.
- Les termes déjà attribués manuellement à l'article restent affichés et ne sont jamais retirés automatiquement.
- Un lien « pourquoi cette suggestion ? » affiche l'extrait du texte qui a motivé la proposition.

### Gérer le cas des nouveaux termes

Quand le rédacteur autorise la création de nouveaux termes, on utilise `wp_insert_term()` avant d'attacher le terme à l'article avec `wp_set_object_terms()`, et on journalise la création dans une table dédiée pour que l'équipe éditoriale puisse repasser dessus en fin de semaine et fusionner les doublons éventuels.

## Ce que nous avons mesuré après trois mois

Sur les articles où la suggestion a été utilisée, le taux d'acceptation des catégories proposées dépasse 80 %, contre un taux beaucoup plus faible pour les étiquettes, plus fines et plus sujettes à interprétation. Le gain de temps réel se situe surtout sur les articles rédigés par des pigistes qui ne connaissent pas encore toute la taxonomie du site.

> La suggestion IA a surtout changé une chose chez nous : les rédacteurs relisent enfin la liste des catégories existantes avant d'en proposer une nouvelle, parce que l'interface la leur montre sans qu'ils aient à aller la chercher.

## Notre verdict

Ce module ne remplace personne : il réduit la friction du moment le plus fastidieux de la publication, sans jamais retirer la main au rédacteur. La règle qui a le plus compté dans la réussite du projet n'est pas technique, elle est éditoriale : ne jamais proposer plus de trois catégories, pour forcer le modèle à trancher plutôt qu'à lister toute la taxonomie par prudence.

Si vous envisagez ce type de fonctionnalité, commencez par cette contrainte de taxonomie fermée : c'est elle qui évite le dérapage le plus fréquent, celui d'un site qui se retrouve avec des dizaines de catégories quasi identiques créées en quelques semaines.
