Google et visibilité · 9 min · publié le 10 octobre 2026

Liens internes injectés dans d'anciens articles

Un script a parcouru la base et a glissé des ancres dans d’anciens articles. Grep en base, pas seulement le footer. Les retirer à la main sur 400 posts sans couper le script, c’est recommencer demain.

Réponse directe

Un script a parcouru la base et a ajouté des ancres. Grep en base, pas seulement le footer. Les retirer à la main sur 400 articles sans couper le script est perdu d'avance.

liens internes spam ancres injectées wordpress spam in content

Où ça se loge (posts, options, widgets)

post_content : le classique. postmeta des constructeurs (Elementor JSON, Divi, Gutenberg blocs sérialisés) : le lien n’est pas dans post_content lisible. options : site_description, un extra « scripts header », un widget texte. mu-plugin qui filtre the_content à la volée : le HTML en base est propre, le front est sale. Dans ce dernier cas, « nettoyer la base » ne suffit pas.

Commentaires approuvés avec lien : autre article, parfois cumulé. Menus (nav_menu_item) : une entrée « Casino » ajoutée. Ça se voit dans Apparence → Menus, encore faut-il ouvrir.

PrestaShop / autres CMS : même idée, tables CMS et traductions. Le réflexe « je regarde le footer du thème » reste insuffisant.

Reconnaître une ancre injectée

Ancre hors langue, URL hors sujet, style inline bizarre, lien au milieu d’une phrase qui tenait debout en 2019. Parfois un seul lien « discreet » vers un shortener. Comparez à une sauvegarde d’avant l’entrée si vous en avez une propre.

Des liens internes vers /pills/ ou vers un sous-domaine inventé : même famille. 410 sur la cible + retrait de l’ancre.

Méfiez-vous des faux positifs : un article qui cite un laboratoire, un partenaire. On trie. Trois humains, pas un REGEXP unique sur tout `wp_posts`.

Couper le script avant le balai

Cron, mu-plugin, admin-ajax, un plugin « SEO booster » nulled : tant qu’il tourne, chaque nuit réécrit. Trouvez-le (dates, fichiers hors zip, cron hébergeur). Les portes dérobées aiment ce rôle : discret, utile au SEO spam.

Changer les mots de passe panel / admin ensuite. Un script remis 24 h plus tard, c’est un accès encore ouvert, pas un « cache ».

Wordfence « réparer » le cœur ne lit pas vos 400 articles. Inutile comme seul geste. Le guide WordPress : comparer le code, puis la base.

Nettoyer la base sans tout casser

Export, travail sur copie, requêtes ciblées (un domaine, une ancre), relecture d’un échantillon, puis prod. Les sérialisés PHP (widgets, Elementor) cassent si vous remplacez une sous-chaîne sans recalculer les longueurs. Si vous ne savez pas, ne le faites pas à la main : outil qui gère la sérialisation, ou prestataire.

Revisions WordPress : l’ancienne version peut encore contenir le spam. Purge des révisions après coup, ou Google les ignore si le live est propre — mais un restore « une révision » les ramène.

Multisite : chaque blog. Un seul `wp_posts` nettoyé sur trois, le spam reste.

On n’exécute pas de payload trouvé dans la base. On l’isole, on le retire, on constate.

Thème, constructeur, extra Elementor

Un HTML dans le thème enfant (single.php) ajoute le lien à tous les posts sans toucher la base. Grep les templates. Un extra Elementor globale, un « footer theme builder ». Désactiver Elementor pour tester (staging) : si les liens disparaissent, ce n’était pas post_content.

Les add-ons abandonnés sont une porte. Après retrait des liens, listez-les pour remplacement. Pas pendant le premier diagnostic, pour ne pas tout casser.

Cache constructeur + CDN : purge après nettoyage, sinon l’inspection GSC voit encore les ancres.

SEO : ces liens ont déjà parlé à Google

Recrawl des articles touchés (sitemap, quelques inspections sur les plus vus). Pas 400 inspections. Les positions reviendront plus vite si le HTML live est net que si vous publiez 50 nouveaux posts.

Liens sortants toxiques : les retirer suffit en général. Pas besoin d’un disavow pour ça — le disavow, c’est pour des backlinks, un autre sport, souvent inutile ici.

Si Safe Browsing a été déclenché par ces pages (rare, plutôt les kits), 410 / propre puis réexamen.

Vérifier que ça ne se réécrit pas

J+1, J+7 : rouvrir 10 articles au hasard, front déconnecté. Une ancre qui revient : script ou accès encore là. Cron panel.

Surveillez les dates `post_modified`. Un pic à 3 h du matin sur 200 IDs n’est pas une session de rédaction.

Si la base est trop sale ou sérialisée, déclarez. Premiers gestes : copie SQL avant le grep courageux du dimanche.

Cas fréquent : footer nettoyé trois fois, 180 articles « plomberie » avec une ancre casino au 2e paragraphe, cron hebdo encore actif.

Questions fréquentes

Un rechercher-remplacer dans l’admin WordPress suffit-il ?

+
Sur post_content parfois. Pas sur le JSON Elementor, pas sur un filtre the_content, pas sur les widgets sérialisés. Vérifiez le front après, déconnecté.

Combien de temps pour que Google oublie les ancres ?

+
Après recrawl des pages. Semaines possibles. Le live propre compte plus qu’un communiqué. Renforcez plutôt que republier en masse.

Puis-je restaurer une sauvegarde d’articles seulement ?

+
Si la sauvegarde est d’avant l’injection et que le reste du site (fichiers) est déjà propre, oui sur une copie de test d’abord. Une sauvegarde trop récente ramène les ancres. Une trop vieille écrase du contenu légitime.

Les extraits Google montrent encore le lien spam. Le site est-il sale ?

+
Pas forcément : extraits en retard. Contrôlez le HTML live et l’inspection. Si le live est net, attendez. Si le live est sale, le script ou le cache.

Akismet aurait-il empêché ça ?

+
Non. C’est une écriture en base ou un filtre, pas un commentaire. Akismet n’est pas un IDS.
À lire ensuite
Guide WordPress piraté Pages spam Dilution après spam Commentaires et payload Porte dérobée Déclarer mon site