Un client gérant un site de documentation technique de plus de 800 pages nous a soumis un problème récurrent : des liens internes cassés apparaissaient régulièrement après des réorganisations de contenu, sans que personne ne les remarque avant qu’un visiteur ne tombe dessus. La détection existait déjà via un plugin classique. Ce qui manquait, c’était une proposition de correction pertinente, pas seulement une liste d’URL en erreur.
Voici la recette que nous avons mise en place : un outil MCP qui scanne, un agent qui propose, et une file de validation qui garde un humain dans la boucle avant toute modification réelle.
Le problème de départ
Une liste de 404 brute ne dit rien de la correction à apporter. Un lien vers /guide-installation-v2/ qui renvoie une erreur peut correspondre à une page renommée en /guide-installation/, à une page fusionnée avec une autre, ou à un contenu réellement supprimé qui ne doit pas être remplacé. Décider entre ces trois cas demandait auparavant une recherche manuelle systématique.

Étape 1 : détecter les liens cassés
Un outil MCP scan_broken_links parcourt le contenu publié à intervalle régulier, extrait les liens internes de chaque article via une expression régulière sur le contenu HTML, et vérifie leur statut avec une requête HEAD.
function agence_scan_broken_links() {
$posts = get_posts( array( 'post_type' => 'post', 'posts_per_page' => -1 ) );
$casses = array();
foreach ( $posts as $post ) {
preg_match_all( '/href="(https?:\/\/[^"]+)"/', $post->post_content, $matches );
foreach ( $matches[1] as $url ) {
if ( strpos( $url, home_url() ) !== 0 ) {
continue;
}
$reponse = wp_remote_head( $url, array( 'timeout' => 5 ) );
$code = wp_remote_retrieve_response_code( $reponse );
if ( 404 === (int) $code ) {
$casses[] = array( 'source_id' => $post->ID, 'url_cassee' => $url );
}
}
}
return $casses;
}
Étape 2 : proposer une correction, pas l’appliquer
Pour chaque lien cassé, l’agent reçoit la liste des titres et slugs de contenu publié récemment modifié, et propose la correspondance la plus probable selon la similarité du slug et du titre de la page ciblée. Cette proposition est déposée dans une table dédiée avec un statut en_attente, jamais appliquée directement au contenu.
- Correspondance forte (slug quasi identique) : proposition affichée en priorité haute.
- Correspondance faible ou absente : le lien est signalé sans proposition de remplacement, pour éviter une correction hasardeuse.
- Aucune modification du contenu publié n’a lieu tant qu’un humain n’a pas validé la ligne correspondante.
Étape 3 : la file de validation
L’équipe éditoriale consulte une page d’administration listant chaque lien cassé, la correction proposée, et deux actions possibles : accepter (le lien est remplacé dans le contenu) ou rejeter (le lien reste signalé, à traiter manuellement). Chaque décision est journalisée avec l’identifiant de la personne ayant validé.
{
"source_id": 4821,
"url_cassee": "https://exemple.test/guide-installation-v2/",
"proposition": "https://exemple.test/guide-installation/",
"confiance": "haute",
"statut": "en_attente"
}
Ce que cette recette évite délibérément
Nous avons volontairement écarté l’option d’une correction totalement autonome, y compris pour les correspondances à forte confiance. Un lien remplacé automatiquement vers une mauvaise page reste plus coûteux à repérer qu’un lien cassé visible : l’erreur silencieuse est pire que l’erreur visible. Ce choix n’a rien d’universel — il correspond à un site de documentation où l’exactitude prime sur la vitesse de correction.
Un lien cassé se voit et s’excuse. Un lien mal redirigé se découvre bien plus tard, et se pardonne moins facilement.
Résultat après trois mois
Le scan hebdomadaire prend environ quinze minutes pour l’ensemble des 800 pages. Sur la période, une centaine de liens cassés ont été détectés, dont environ 70 % avec une proposition à confiance haute validée telle quelle par l’équipe éditoriale, sans recherche manuelle nécessaire.
En résumé
Automatiser la détection des liens cassés est simple et sans risque. Automatiser leur correction l’est beaucoup moins, et gagne à rester une proposition validée plutôt qu’une action autonome, surtout tant que la confiance dans la pertinence des correspondances proposées n’a pas été éprouvée sur la durée.