Un client dans le secteur du jardinage utilisait depuis quelques semaines une extension de rédaction assistée par IA pour enrichir ses fiches conseils. Le texte généré incluait régulièrement des phrases du type « comme expliqué dans notre article sur la taille des rosiers », avec un lien HTML pointant vers une URL de la forme /conseils/taille-des-rosiers/.
Le problème est apparu lors d’un audit de routine : cette page n’avait jamais existé sur le site. Le lien menait droit vers une page d’erreur 404, alors même que le texte environnant donnait l’impression d’un maillage interne cohérent et bien pensé.
Comment le problème est passé inaperçu plusieurs semaines
Le rédacteur qui validait les articles avant publication lisait le texte pour sa qualité éditoriale, pas pour vérifier chaque lien un par un. Visuellement, rien ne distingue un lien vers une page existante d’un lien halluciné : le texte d’ancrage est cohérent, la structure d’URL respecte les conventions du site, et le contexte de la phrase est parfaitement logique. C’est précisément ce qui rend ce type d’erreur dangereux, elle ne saute pas aux yeux.
Sur un audit complet du mois précédent, portant sur 40 articles publiés avec l’assistance de l’extension, nous avons recensé 11 liens internes qui pointaient vers des pages n’ayant jamais existé sur le site, soit un peu plus d’un lien mort tous les quatre articles.
Le script de détection mis en place
Nous avons écrit un script exécuté à chaque publication d’article via le hook save_post, qui extrait tous les liens internes du contenu avec une expression régulière ciblant le domaine du site, puis vérifie l’existence réelle de chaque URL avec url_to_postid(). Quand cette fonction renvoie zéro, le lien ne correspond à aucun contenu publié et l’article est automatiquement placé en brouillon avec une notification à l’équipe éditoriale.
add_action( 'save_post', function ( $post_id ) {
$post = get_post( $post_id );
if ( 'publish' !== $post->post_status ) {
return;
}
preg_match_all(
'/href="(https:\/\/www\.exemple-jardin\.fr\/[^"]+)"/',
$post->post_content,
$matches
);
foreach ( $matches[1] as $url ) {
if ( 0 === url_to_postid( $url ) ) {
wp_update_post( array(
'ID' => $post_id,
'post_status' => 'draft',
) );
// notifier l'équipe éditoriale
break;
}
}
} );

Pourquoi l’IA invente des liens aussi crédibles
Le modèle de langage ne « sait » pas quelles pages existent réellement sur le site du client, il apprend simplement, à partir de son entraînement général, à quoi ressemble une bonne pratique de maillage interne dans un article de blog. Il produit donc un lien statistiquement plausible, avec une structure d’URL et un texte d’ancrage cohérents, sans jamais consulter la liste réelle des contenus publiés. C’est le même mécanisme qui peut le pousser à inventer une fonction WordPress qui n’existe pas : il complète un motif attendu, pas une vérité vérifiée.
- Le prompt ne fournissait à l’IA aucune liste des articles réellement publiés
- Rien n’obligeait le modèle à indiquer l’incertitude sur un lien proposé
- La relecture humaine portait sur le fond, pas sur la vérification technique des liens
Ce que nous avons changé durablement
Au-delà du script de détection, nous avons modifié le prompt de génération pour qu’il ne propose plus jamais de liens internes lui-même : le texte est généré sans lien, et le maillage est ajouté ensuite par une étape séparée qui interroge la vraie liste des articles du site via WP_Query. Cette séparation des responsabilités élimine le risque à la racine plutôt que de le corriger après coup.
Ne demandez jamais à un modèle de langage d’inventer une référence vers votre propre site : il ne le connaît pas, il l’imagine.
En résumé
Un lien halluciné par une IA de rédaction est particulièrement insidieux car il ne présente aucun signe visible d’erreur avant le clic. Un contrôle automatique systématique, exécuté à chaque publication, coûte quelques lignes de code et évite un maillage interne silencieusement cassé. Mieux encore, séparer la génération de texte de la génération de liens supprime purement et simplement la source du problème.