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.
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.
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.
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.