Le WordPress d'aujourd'hui, décodé pour les développeurs

Outils & workflow

Un script qui traque les tables orphelines laissées par une extension désinstallée

Un audit régulier compare les tables présentes en base aux extensions réellement actives, pour repérer ce qu'un désinstallateur a oublié de nettoyer.

Par Clément Hadrot • 2 novembre 2025 • 4 min de lecture • Aucun commentaire
Un script qui traque les tables orphelines laissées par une extension désinstallée

Combien de tables une extension désinstallée laisse-t-elle réellement derrière elle ? La question s’est posée après avoir remarqué, en explorant la base de données d’un site vieux de plusieurs années, une table nommée wp_stat_visites_ancien ne correspondant à aucune extension active. L’extension d’origine avait été désinstallée depuis longtemps, sans que son crochet register_uninstall_hook() ne prenne la peine de nettoyer ses propres tables.

Ce constat isolé a motivé l’écriture d’un script d’audit plus systématique, exécuté périodiquement sur l’ensemble du parc de sites, pour repérer ce type d’oubli. Cet article ne traite pas de la correction du plugin fautif lui-même, mais uniquement de la détection de ces résidus.

Le principe : comparer les tables présentes aux extensions actives

WordPress préfixe généralement, par convention, les tables créées par une extension avec un fragment identifiable, souvent proche du nom de l’extension elle-même. Le script part de cette convention pour comparer la liste complète des tables présentes dans la base, obtenue via wp db query "SHOW TABLES", à la liste des extensions actuellement actives, obtenue via wp plugin list --status=active --field=name. Toute table dont le préfixe ne correspond à aucune extension active, ni aux tables natives de WordPress, est signalée comme suspecte.

#!/usr/bin/env bash
set -euo pipefail

URL_SITE="$1"
PREFIXE=$(wp config get table_prefix --url="$URL_SITE")

TABLES_NATIVES="options postmeta posts terms term_taxonomy term_relationships \
usermeta users comments commentmeta links termmeta"

wp db query "SHOW TABLES LIKE '${PREFIXE}%'" --url="$URL_SITE" --skip-column-names \
  | while read -r table; do
    suffixe="${table#$PREFIXE}"
    if ! echo "$TABLES_NATIVES" | grep -qw "$suffixe"; then
      echo "$table"
    fi
  done

Ce premier passage produit une liste de tables candidates, qu’il faut ensuite confronter manuellement aux extensions réellement actives pour écarter les faux positifs.

Filtrer les faux positifs

L'essentiel à retenir : Un désinstallateur mal écrit laisse souvent des tables orphelines derrière lui ; Comparer le préfixe des tables à la liste des extensions actives révèle l'oubli ; Le script signale, il ne supprime jamais rien automatiquement

Certaines extensions actives créent des tables dont le nom ne ressemble en rien à leur propre nom de dossier, ce qui génère mécaniquement des faux positifs dans le premier passage du script. Une liste blanche, maintenue manuellement dans un fichier de configuration, permet d’exclure ces tables légitimes des résultats affichés.

{
  "tables_ignorees": [
    "wp_woocommerce_sessions",
    "wp_actionscheduler_actions",
    "wp_wc_product_meta_lookup"
  ]
}

Cette liste blanche s’enrichit au fil des passages successifs du script, à mesure que de nouvelles extensions légitimes sont identifiées comme créant des tables au nommage atypique.

Ce que le script ne fait jamais : supprimer

Le script se limite strictement au signalement. Aucune commande de suppression n’y figure, pour une raison simple : une table qui semble orpheline peut en réalité appartenir à une extension désactivée temporairement plutôt que réellement désinstallée, ou à un module conservant volontairement ses données en dehors du cycle de vie standard d’une extension. La décision de suppression reste toujours humaine, prise après vérification manuelle de chaque table signalée.

  • Le script produit une liste, jamais une action de suppression
  • Chaque table signalée est vérifiée manuellement avant toute intervention
  • Une sauvegarde complète précède systématiquement toute suppression décidée

Résultats du premier passage sur le parc

Le premier passage complet sur l’ensemble du parc de sites a remonté onze tables orphelines réparties sur six sites différents, dont plusieurs provenant de la même extension d’analyse de trafic, abandonnée par son éditeur plusieurs années auparavant sans que son désinstallateur n’ait jamais correctement nettoyé ses propres données. Certaines de ces tables dépassaient plusieurs centaines de mégaoctets, un poids mort qui s’était accumulé sans que personne ne s’en aperçoive.

En résumé

Un script de détection, même simple, révèle des résidus qu’aucune procédure de désinstallation n’a réussi à éliminer d’elle-même. Automatiser ce contrôle périodiquement évite de dépendre d’une découverte fortuite, comme celle qui a initialement motivé ce chantier, pour repérer ce type d’accumulation silencieuse dans la base de données.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi