---
title: "Générateur d'articles de blog SEO"
module: ai
type: functional
status: draft
updated: 2026-10-02
---

# Générateur d'articles de blog SEO

Outil interne (réservé à l'équipe ISI) qui rédige des articles de blog optimisés
pour le référencement — à partir de la documentation d'un module ISI-APP, ou d'un
sujet libre — puis les publie en **brouillon** sur le blog WordPress
(isi-app.com) via son API REST.

> Statut : **en développement** (`@dev`). Accessible aux administrateurs ISI et
> aux développeurs, sous `Administration → Générateur de blog`
> (`/admin/blog-generator`).

## À quoi ça sert

Industrialiser la production d'articles de blog SEO de qualité, sans jamais
survendre le produit : l'IA ne décrit **que des fonctionnalités réellement
documentées** dans le module choisi. Un humain relit toujours le brouillon avant
publication.

## Deux sources de vérité

Le choix se fait en tête de l'écran, avant tout le reste.

### Documentation d'un module — « ne rien survendre »

La génération est **ancrée sur la documentation** du module : les fichiers
`docs/<slug>.md` et `.claude/technical-docs/<slug>.md` sont injectés comme
contexte, et le modèle est explicitement instruit de ne rien inventer (pas de
fonctionnalité, d'intégration, de certification ni de chiffre absents du
contexte). Si aucune documentation n'existe pour le module, la génération est
refusée.

### Contexte libre — un article de fond

Tous les articles du blog ne parlent pas du produit. Pour un sujet de fond — « les
mairies en retard sur le virage numérique », par exemple — vous donnez :

- un **sujet** (obligatoire), qui sert de fil directeur ;
- des **éléments de contexte** (facultatifs) : chiffres, études, extraits
  réglementaires, angle à tenir, exemples de terrain.

Le garde-fou change de nature, il ne disparaît pas. L'IA traite le sujet avec ses
connaissances générales du domaine, mais **n'a le droit d'affirmer aucun fait
vérifiable absent de vos éléments** : ni chiffre, ni pourcentage, ni date, ni
montant, ni nom d'organisme, ni étude, ni citation. Sans donnée fournie, elle
reste qualitative. Elle ne décrit **aucune fonctionnalité d'ISI-APP** : tout au
plus une ouverture d'une ou deux phrases vers le produit en fin d'article.

> Un article en contexte libre demande donc la même relecture qu'un autre, avec
> une attention particulière aux chiffres : s'il en apparaît un que vous n'avez
> pas fourni, retirez-le.

## Comment l'utiliser

1. **Configurer WordPress** (une seule fois) : URL du blog, **identifiant exact**
   d'un compte éditeur dédié (le login WordPress, pas le nom affiché) et
   **Application Password**. Le bouton « Tester la connexion » vérifie l'accès
   sans rien publier : il affiche le compte, ses rôles, et alerte si le compte
   n'a pas le droit de créer des brouillons.

   Une fois renseignée, la configuration **se replie** en une simple ligne de
   statut (blog, compte, « Configuré ») pour laisser toute la place au
   générateur. Les boutons « Tester la connexion » et « Modifier » y restent
   accessibles ; « Modifier » rouvre le formulaire, qui se referme après
   enregistrement.
2. **Choisir la source de vérité** (voir ci-dessus). L'écran se parcourt en
   **trois étapes** — *Source*, *Cadrage*, *Maillage* — et s'adapte au choix fait
   à la première : le formulaire n'affiche jamais que les champs qui concernent
   la source retenue.

   - **Documentation d'un module** : choisir un module dans la liste, triée par
     ordre alphabétique des titres de documentation. Les **sommaires de module**
     (`README`) n'y figurent pas : ce sont des pages de liens, sur lesquelles
     l'IA n'aurait rien de concret à écrire. Le bouton **« Parcourir les
     docs »**, à droite du champ, ouvre les documentations fonctionnelles
     publiques dans un nouvel onglet pour vérifier le contenu d'un module avant
     de générer. Dès qu'un module est sélectionné, il devient **« Voir cette
     doc »** et pointe directement sur la documentation correspondante.
   - **Contexte libre** : saisir le **sujet** de l'article, et, si vous en avez,
     les **éléments de contexte** sur lesquels l'IA a le droit de s'appuyer.
3. **Étape 2 — Cadrage** : la **longueur cible** (800 à 2 500 mots ; 1 200 par
   défaut), d'éventuelles **consignes**, un **ancien article** à retravailler et
   l'**article du blog à remplacer**.
4. **Étape 3 — Maillage** : les **liens internes et externes** à intégrer, puis
   un **récapitulatif** de tout ce qui part au modèle — y compris ce qui a été
   saisi aux étapes précédentes et n'est plus à l'écran.

   Chaque étape est validée avant la suivante : l'erreur s'affiche sous le champ
   concerné, et non au moment du lancement. Le fil d'étapes en tête permet de
   **revenir** sur une étape déjà franchie ; rien n'est perdu en naviguant.

   Pour les liens internes, **« Articles proches de votre sujet »** propose les
   articles du blog les plus pertinents pour le sujet en préparation : un clic
   les ajoute, avec leur titre comme ancre. La liste **« Articles du blog à
   lier »** reste disponible en dessous, avec les 50 derniers articles publiés.
   Dans les deux cas, plus fiable que de retaper une URL de mémoire.
5. **Générer** : l'IA (Claude) produit le titre, les métadonnées SEO, le contenu
   HTML et une FAQ. Le bouton passe en « Lancement de la génération… » dès le
   clic, puis un bandeau d'attente indique l'étape en cours (mise en file, puis
   rédaction) et le **temps écoulé**. Comptez une à deux minutes : la page se met
   à jour automatiquement, elle peut rester ouverte.
6. **Prévisualiser** : aperçu du rendu, longueurs des métas, HTML prêt à coller.
   Trois boutons **« Copier »** en tête de l'aperçu évitent de sélectionner quoi
   que ce soit à la souris (voir « Copier le résultat » plus bas).
   La FAQ est **intégrée en fin d'article** (section « Questions fréquentes »),
   elle apparaît donc dans l'aperçu et part avec le brouillon. Le tableau des
   **contrôles de lisibilité** donne le verdict Yoast avant publication (voir
   ci-dessous).
7. **Choisir une image mise en avant** (facultatif) parmi les images de la
   médiathèque WordPress. Sans sélection, l'article part sans image : elle reste
   à poser dans WordPress.
8. **Choisir les catégories** WordPress du brouillon (facultatif, sélection
   multiple ; la liste est lue sur le blog). Sans sélection, WordPress applique
   sa catégorie par défaut (« Non classé »).
9. **Envoyer en brouillon WordPress** : l'article est créé au statut *draft*
   (invisible publiquement). Un rédacteur le relit et le publie depuis WordPress.

   Pour un article **retravaillé**, choisissez plutôt l'article du blog à
   remplacer (champ « Article du blog à remplacer », sous l'ancien article) :
   le bouton **« Mettre à jour l'article #… »** écrase alors son contenu au lieu
   d'en publier un second sur la même requête. L'**URL et le statut** de
   l'article d'origine sont conservés — son référencement acquis aussi. Le
   remplacement demande confirmation, il est sans retour côté blog.

   Une fois l'envoi enregistré, le bouton devient **« Créer un second
   brouillon »** et demande confirmation : republier crée un article
   supplémentaire sur le blog, à supprimer à la main s'il n'était pas voulu.
10. **Retrouver un article** dans l'onglet **« Historique »** (voir ci-dessous).

## Historique des générations

L'écran est découpé en deux onglets : **« Génération »** (le formulaire et
l'aperçu) et **« Historique »**, dont le compteur indique le nombre total de
générations. Passer d'un onglet à l'autre est instantané et **n'interrompt pas
une génération en cours** : vous pouvez consulter l'historique pendant que l'IA
rédige, le suivi reprend son affichage au retour.

L'onglet « Historique » liste les générations, toutes personnes confondues, 15 par
page, avec un filtre par **source** et par **auteur**. Le filtre de source liste
les modules déjà utilisés, plus une entrée **« Contexte libre »** regroupant les
articles de fond. Chaque ligne indique :

- la **date** de lancement et l'**auteur** de la génération ;
- la **source** utilisée — le module, ou le sujet saisi assorti d'un badge
  « Contexte libre » —, le **titre** de l'article produit et, le cas échéant, le
  nombre de **réécritures** appliquées ;
- le **statut** de la génération (en attente, en cours, terminé, échec — le
  message d'erreur s'affiche en infobulle sur le badge) ;
- le **verdict de lisibilité** mesuré au moment de la génération (Conforme, À
  surveiller, Hors seuil), avec ses mesures clés en infobulle. C'est lui qui
  permet de voir, sur dix articles, si un réglage des consignes améliore
  vraiment la copie. Les générations antérieures au 28/09/2026 affichent
  « Non mesuré » — jamais un verdict inventé ;
- le **coût** en tokens (génération et réécritures cumulées) ;
- l'**article WordPress**, ouvert dans un nouvel onglet. Le lien mène là où
  l'article est réellement consultable : sur le blog s'il est **publié**, sur son
  écran d'édition WordPress s'il est encore en **brouillon** — un brouillon n'est
  pas visible publiquement. Pour un article publié, une icône crayon donne accès
  à l'édition. Suivent son statut réel (Brouillon, Publié, Corbeille,
  Introuvable) et la date d'envoi.

Les actions se trouvent dans la **première colonne** :

- **Reprendre** rouvre un article terminé dans l'onglet « Génération » : aperçu,
  métadonnées, contrôles de lisibilité et bouton de publication redeviennent
  disponibles, avec les consignes et les liens d'origine. C'est le moyen de
  rattraper un article perdu parce que l'onglet du navigateur avait été fermé, ou
  de relancer une génération en ajustant seulement les consignes.
- **Rattacher** retrouve sur WordPress, d'après le slug de l'article, un article
  publié **avant** la mise en place du suivi — ou publié à la main hors de
  l'outil. Voir ci-dessous.
- **Rafraîchir les statuts WordPress** (en haut de la liste) relit sur le blog
  l'état réel des articles affichés : un article publié depuis WordPress cesse
  alors d'apparaître comme un brouillon.

Chaque génération a une **URL partageable** : `…/admin/blog-generator?job=42`
rouvre directement l'article correspondant.

### « Aucun envoi enregistré » sur un article pourtant publié

Le suivi du lien WordPress n'existe que depuis le **28/08/2026**. Les articles
envoyés avant cette date n'en portent aucune trace : l'historique affiche
« Aucun envoi enregistré », ce qui signifie *information inconnue*, et non
*article non publié*.

Deux façons de rattraper :

- ligne par ligne, le bouton **« Rattacher »** ;
- en une fois, la commande `php artisan isi:blog:reconcile-drafts`
  (option `--dry-run` pour simuler, `--refresh-status` pour relire aussi les
  statuts). Elle recherche chaque article sur le blog d'après son slug.

Passée sur les données existantes le 28/08/2026, elle a rattaché l'article
« Connecteur GLPI » du 24/08 à l'article WordPress **#2024**, déjà publié.

## Contrôles de lisibilité et voix active

Yoast SEO plafonne la **voix passive** à **10 % des phrases**. Les premiers
articles générés dépassaient ce seuil. Deux réponses ont été mises en place le
28/08/2026.

### 1. Des consignes explicites à la rédaction

L'IA doit désormais :

- viser **moins de 5 %** de phrases passives, FAQ comprise ;
- donner un **sujet qui agit** — vous, votre équipe, ou Isi-APP (« Isi-APP
  affecte chaque demande au bon service » plutôt que « les demandes sont
  affectées au bon service ») ;
- **s'adresser au lecteur** (« exportez vos données en un clic » plutôt que « les
  données peuvent être exportées ») ;
- bannir les tournures « il est possible de », « il est recommandé de », « peut
  être + participe passé ».

Les autres critères de lisibilité mesurés par Yoast sont couverts au passage :
longueur des phrases, mots de transition, variété des débuts de phrase, longueur
des paragraphes et fréquence des sous-titres. Ces règles s'appliquent aussi au
**retravail d'un ancien article**, qui contient presque toujours trop de passifs.

### Écrire comme un rédacteur professionnel

Depuis le 28/09/2026, les consignes de rédaction visent aussi le **naturel** du
texte — un article ne doit pas se lire comme un texte produit par une machine :

- **Phrases courtes** : moins de 15 % au-delà de 20 mots (Yoast en tolère
  25 %). Depuis le 02/10/2026, la consigne ne vise plus « zéro exception », qui
  hachait le texte.
- **Pas de « Concrètement » ni « En pratique » en ouverture de phrase**, ni de
  « Découvrez comment », « répond précisément à », « capital humain » ou de
  série de tirets cadratins.
- **Mots de transition variés** : jamais deux fois le même dans un paragraphe, et
  pas d'enchaînement mécanique « de plus » / « en outre » / « par ailleurs ».
- **Rythme varié** : des phrases courtes alternées avec des phrases moyennes.
- **Formules interdites**, marqueurs habituels du texte généré : « à l'ère du
  numérique », « dans un monde en constante évolution », « il est important de
  noter que », « incontournable », « en conclusion », « plongeons dans »…
- **Concret plutôt que général**, sous-titres informatifs, pas de question
  rhétorique en tête de chaque section, pas de triade « simple, rapide et
  efficace ».

Ces consignes vivent dans le **prompt versionné** `blog-seo-generator` : elles
s'appliquent aux deux sources, et se modifient sans toucher au code.

### Charte éditoriale du blog isi-app.com

Depuis le 02/10/2026, le générateur suit les mêmes règles que le projet Claude
« Articles isi-app.com » :

- **Lecteurs visés** : DSI, RH et directions d'établissements de santé, d'ESMS,
  de collectivités et d'associations.
- **Produits citables** : Isi-APP et ses modules publiés sur le site, rien
  d'autre. Les libellés de l'interface sont repris à l'identique, et le
  périmètre (inclus dans Isi-APP ou réservé à un module) est précisé.
- **Passage douteux** : l'IA le signale par un commentaire
  `<!-- À VÉRIFIER : … -->` dans le HTML, à traiter avant publication.
- **Longueur** : 1 200 à 2 000 mots par défaut, 700 au minimum.
- **Maillage** : au moins deux liens internes, dont la page pilier du module, et
  un lien externe (le site de Youzer pour Isi-Identité), ouvert dans un nouvel
  onglet.

### 2. Une mesure dans l'écran, avant publication

L'aperçu affiche un tableau **« Contrôles de lisibilité (Yoast) »** : pour chaque
critère, la valeur mesurée, la cible et un état (**Conforme**, **À surveiller**,
**Hors seuil**).

| Contrôle | Cible |
|----------|-------|
| Phrases à la voix passive | moins de 10 % |
| Phrases de plus de 20 mots | moins de 25 % |
| Phrases avec mot de transition | au moins 30 % |
| Paragraphes trop longs | aucun au-delà de 150 mots |
| Texte sans sous-titre | moins de 300 mots d'affilée |
| Longueur de l'article | au moins 700 mots |

Un bouton déplie la **liste des phrases repérées** comme passives, pour juger sur
pièces.

### 3. La correction assistée

Le bouton **« Corriger la lisibilité »** lance une seconde passe d'IA dès qu'un
défaut **de phrase** est mesuré. Trois défauts sont traités, seuls ou ensemble :

| Défaut | Ce que fait la passe |
|---|---|
| Phrases à la voix passive | les réécrit à la voix active |
| Phrases de plus de 20 mots | les coupe en deux phrases ou davantage |
| Manque de mots de transition | en ajoute le nombre nécessaire, sans inventer de contenu |

Jusqu'au 28/09/2026, seule la voix passive était corrigeable : un article
conforme sur ce point mais **hors seuil sur la longueur des phrases** — le cas le
plus fréquent — n'avait aucun recours dans l'écran.

La passe **ne touche qu'aux phrases repérées** : sens, faits, chiffres,
structure, liens et métadonnées SEO restent inchangés. Comptez une à deux
minutes, comme pour une génération. Les paragraphes trop longs, l'absence de
sous-titres et la longueur de l'article restent affichés **sans bouton** : les
corriger reviendrait à réécrire l'article, pas à le retoucher.

Le bouton **« Revenir à la version d'origine »** rétablit l'article tel qu'il
avait été généré. L'historique indique le nombre de corrections appliquées.

> Le compteur de l'écran reproduit la méthode de Yoast, il n'en est pas une copie
> exacte. Le contrôle final se fait toujours dans Yoast, sur le brouillon.

## Copier le résultat

En tête de l'aperçu, trois boutons déposent le résultat dans le presse-papier —
plus besoin de sélectionner l'article à la souris :

| Bouton | Contenu copié |
|--------|---------------|
| **Copier l'article** | L'article **mis en forme**. Un collage dans l'éditeur visuel de WordPress (ou dans Word, un mail) garde titres, listes, gras et liens. |
| **Copier le HTML** | Le même article en **code HTML**, à coller dans l'éditeur de code de WordPress. |
| **Copier les métadonnées SEO** | Titre H1, meta title, meta description, slug, requête cible et requêtes secondaires, en texte brut — utile pour remplir Yoast à la main. |

Dans les trois cas, c'est **ce qui part réellement sur WordPress** qui est copié,
FAQ comprise. Une notification confirme la copie ; en cas d'échec (presse-papier
bloqué par le navigateur), elle le dit au lieu de laisser croire à une réussite.

Les petites icônes de copie des blocs de code (« HTML à coller », « JSON-LD »)
fonctionnent elles aussi désormais en environnement de développement : elles
échouaient jusqu'ici sans rien afficher.

## Faits à vérifier (contexte libre)

En contexte libre, l'écran compare les **faits vérifiables** de l'article — 
pourcentages, montants, années, grands nombres, tournures du type « selon une
étude » — avec les éléments que vous avez fournis. Tout ce qui n'y figure pas
est listé dans un encadré, avec la phrase d'origine.

Ce contrôle est **déterministe** : il ne juge pas si l'affirmation est vraie, il
signale ce que rien ne permet de vérifier. À vous de confirmer le chiffre, de le
sourcer dans les éléments de contexte, ou de le retirer de l'article.

## Éviter de se cannibaliser

Deux articles qui visent la même requête se privent mutuellement de position dans
Google. Si le blog contient déjà des articles répondant à la requête cible de
l'article généré, un avertissement les liste dans l'aperçu. À vous de juger : ou
le sujet est bien distinct, ou il vaut mieux retravailler l'article existant que
d'en publier un second.

## Métadonnées SEO (Yoast)

Le blog utilise **Yoast SEO**. Les métas (`title`, `description`, `focus
keyphrase`) sont **écrites automatiquement** sur le brouillon : plus de
copier-coller à faire à la validation. Vérifié en écriture réelle sur
isi-app.com le 20/08/2026 — Yoast y expose lui-même ces champs via l'API, aucun
plugin supplémentaire n'a été nécessaire.

Elles restent affichées dans l'écran de génération avec leur longueur, pour
contrôle avant publication. Si un jour le blog cible n'expose plus ces champs, il
suffit de poser `WP_YOAST_META_REST=false` : le générateur revient au mode
copier-coller.

### L'expression clé

Yoast gratuit cherche les **mots exacts** de l'expression clé, sans synonymes.
L'IA la place donc dans le premier paragraphe, en tête du titre SEO, dans la
méta-description (120 à 155 caractères, sans « Découvrez »), dans le slug, qui
reprend l'expression clé elle-même, et dans au moins 30 % des sous-titres. Sa
densité reste entre 0,5 et 3 %, soit environ 7 occurrences pour 1 500 mots.

## Encadré module en fin d'article

Chaque article se termine, **après la FAQ**, par un encadré qui présente le
module Isi-APP le plus lié au sujet : nom, accroche, trois points forts, bouton
« Découvrir … » vers la page du module et bouton « Demander une démo » vers
l'essai gratuit.

L'IA choisit seulement le module et rédige l'accroche (une phrase de 20 mots au
plus). Le nom, les points forts et les liens viennent d'une liste fixe, reprise
mot pour mot des pages du site : l'IA ne peut ni les reformuler ni inventer une
adresse. Quand aucun module ne correspond au sujet, l'encadré présente Isi-APP
avec le seul bouton de démo.

La mise en forme vient du thème du site (classes `isi-cta`) : dans l'aperçu de
l'écran, l'encadré apparaît sans style. Il n'entre pas dans la mesure de
lisibilité, et la correction assistée n'y touche pas.

## FAQ et balisage JSON-LD

La FAQ générée, de 3 à 5 questions, est ajoutée **dans le corps de l'article**,
juste avant l'encadré module, sous un titre « Questions fréquentes ». C'est ce qui lui donne sa valeur :
elle répond à des requêtes formulées en question et sert de matière aux réponses
des moteurs conversationnels.

Le bloc **JSON-LD `FAQPage`** proposé à la copie reste **facultatif**. Il décrit la
FAQ visible sur la page — condition posée par Google pour qu'un balisage soit
valide. À savoir avant de s'en servir : depuis août 2023, les résultats enrichis
FAQ ne sont plus affichés que pour les sites publics de santé et
d'administration, le gain est donc limité pour un site B2B.

## Où trouver l'Application Password

Dans WordPress : **Utilisateurs → Profil** du compte concerné, section
**« Mots de passe d'application »** → saisir un nom d'application (par exemple
`ISI-APP Blog Generator`), valider, puis copier la valeur générée.

Deux points qui font perdre du temps :

- Le mot de passe attendu est la valeur **générée par WordPress** — 24 caractères
  alphanumériques présentés sous la forme `xxxx xxxx xxxx xxxx xxxx xxxx` — et
  non le *nom* donné à l'application, ni le mot de passe du compte. L'écran de
  configuration refuse désormais toute valeur qui n'a pas ce format.
- Cette valeur n'est affichée **qu'une seule fois** et n'est pas récupérable
  ensuite : si elle est perdue, révoquer la ligne et en créer une nouvelle.

En cas d'échec, le test de connexion affiche une **piste de correction** sous le
message d'erreur (identifiants à revoir, droits insuffisants, URL ou permaliens
du blog, ou en-tête d'authentification bloqué par le serveur du blog).

## Limites (phase 1)

- Publication en **brouillon uniquement** (pas de publication directe ni
  programmée).
- **Un seul blog** cible (isi-app.com).
- Le contrôle final de fidélité repose sur la **relecture humaine** du brouillon.
- L'ancrage se fait par **choix explicite du module** (pas de recherche
  sémantique/RAG sur l'ensemble de la documentation).
- En **contexte libre**, rien ne vérifie automatiquement les faits avancés : la
  consigne interdit d'inventer un chiffre, la relecture humaine reste le seul
  contrôle.
- Le compteur de voix passive **reproduit** la méthode de Yoast sans en être une
  copie : un écart avec Yoast reste possible sur des tournures rares. Le contrôle
  final se fait dans Yoast, sur le brouillon.
- L'**image mise en avant** se choisit parmi les images déjà présentes dans la
  médiathèque : l'outil ne produit pas de visuel.
- Le statut WordPress n'est relu **qu'à la demande** (bouton de rafraîchissement),
  pas en continu.
- L'historique n'a **aucune règle de purge** : toutes les générations sont
  conservées.

## Voir aussi

- Doc technique : `.claude/technical-docs/ai/blog-seo-generator.md`
