Performances et surveillance

Requêtes SQL pour nettoyer les données orphelines et purger la base de données de WordPress

Vérifié le 9 min de lecture WordPress base de données performances

Une ancienne base WordPress peut accumuler des métadonnées sans objet associé, des révisions et des données temporaires. Ancien ou volumineux ne veut pas dire superflu. Ce guide permet de repérer des candidats et de préparer un nettoyage limité ; ce n'est pas une série de commandes à coller en production.

Préparer une sauvegarde et délimiter le site

Vérifiez la base et le préfixe réels dans wp-config.php. Les exemples utilisent wp_. En multisite, les tables des utilisateurs peuvent être partagées et chaque site a son propre jeu de tables : n'appliquez pas ces exemples sans examiner cette structure.

Faites un essai sur un clone. Avant de nettoyer la production, préparez une sauvegarde récente et maîtrisez les écritures des visites, du cron, des files d'attente et des intégrations. Afficher une page de maintenance n'arrête pas forcément toutes ces écritures.

Depuis l'installation de WordPress, exportez vers un chemin privé en dehors des racines web. Dans cet exemple, créez d'abord ~/copias-docs avec les permissions 700 et vérifiez qu'il n'est pas publié :

umask 077
wp db export "$HOME/copias-docs/antes-limpieza.sql" &&
sha256sum "$HOME/copias-docs/antes-limpieza.sql" > "$HOME/copias-docs/antes-limpieza.sql.sha256"

Si l'export échoue, le fichier peut être incomplet : ne continuez pas. Utilisez de nouveaux noms pour ne pas écraser une sauvegarde précédente, téléchargez la sauvegarde et vérifiez une restauration dans une base temporaire. La somme de contrôle vérifie l'intégrité, elle ne prouve pas que la restauration fonctionne.

Examiner les métadonnées d'articles orphelines

Exécutez d'abord le comptage et un échantillon dans phpMyAdmin :

SELECT COUNT(*) AS filas_afectadas
FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;

SELECT pm.meta_id, pm.post_id, pm.meta_key
FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL
LIMIT 50;

Cherchez pourquoi elles existent et s'il y a des importations ou des processus inachevés. Si vous avez confirmé qu'elles sont superflues, voici la suppression équivalente :

DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;

Sur de grandes tables, le développeur doit préparer des lots limités et surveiller les verrous ; ne lancez pas une suppression massive simplement parce que l'échantillon est petit.

Examiner les métadonnées d'utilisateurs orphelines

SELECT COUNT(*) AS filas_afectadas
FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;

SELECT um.umeta_id, um.user_id, um.meta_key
FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL
LIMIT 50;

Seulement après avoir examiné l'ensemble, le contexte multisite et la sauvegarde, la suppression équivalente est :

DELETE um FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;

Transactions et caches

Si toutes les tables modifiées sont en InnoDB, vous pouvez tester une seule suppression vérifiée dans une transaction, dans la même session de base de données :

START TRANSACTION;
-- Exécutez un seul DELETE vérifié et contrôlez le nombre de lignes.
ROLLBACK;

N'utilisez pas COMMIT avant d'avoir terminé les vérifications prévues. MyISAM et les modifications de structure n'offrent pas ce même retour en arrière ; ne convertissez pas de tables à la volée au cours d'un nettoyage. Une transaction peut maintenir des verrous tant qu'elle reste ouverte.

Le SQL direct n'exécute pas les API et ne met pas à jour tous les caches de WordPress. Après un nettoyage validé, invalidez les caches concernés avec une portée connue, sans vider sans distinction le Redis d'autres sites.

Étiquettes vides

Listez les étiquettes, y compris les vides, et vérifiez leur colonne count :

wp term list post_tag --hide_empty=0 --fields=term_id,name,count

Une valeur zéro est un candidat à examiner, pas un ordre de suppression : il peut exister du contenu non publié ou une raison éditoriale de garder l'étiquette. Pour supprimer une étiquette confirmée, utilisez l'API via WP-CLI en remplaçant le marqueur par son ID réel :

wp term delete post_tag ID_REVISADO

Ne supprimez pas les relations de taxonomies directement en SQL. Vérifiez ensuite les liens, la navigation et le contenu associé.

Articles dont l'auteur n'existe plus

Ne les supprimez pas et ne réattribuez pas tous les types de contenu sans les examiner. Cette requête permet de repérer les candidats :

SELECT p.ID, p.post_type, p.post_status, p.post_title, p.post_author
FROM wp_posts p
LEFT JOIN wp_users u ON p.post_author = u.ID
WHERE u.ID IS NULL
LIMIT 50;

Certains enregistrements peuvent utiliser légitimement l'auteur 0. Pour un article dont l'auteur doit être corrigé, choisissez un utilisateur valide et passez par l'édition de WordPress ou par wp post update avec les identifiants vérifiés. Ainsi s'exécutent les opérations de l'application qu'un UPDATE direct ignorerait.

Révisions et transients

Pour examiner les anciennes révisions, utilisez une date UTC cohérente avec la colonne :

SELECT ID, post_parent, post_modified_gmt
FROM wp_posts
WHERE post_type = 'revision'
  AND post_modified_gmt < DATE_SUB(UTC_TIMESTAMP(), INTERVAL 10 DAY)
ORDER BY ID
LIMIT 50;

Dix jours n'est qu'un exemple. Décidez de la durée de conservation selon vos besoins et supprimez les révisions choisies avec un outil qui utilise les API de WordPress, et non en effaçant en bloc des lignes de wp_posts en laissant leurs métadonnées.

Pour examiner les transients sans afficher leurs valeurs, puis ne retirer que ceux qui ont expiré :

wp transient list --fields=name,expiration
wp transient delete --expired

La liste inclut des transients non expirés ; vérifiez leur date d'expiration. Avec un cache persistant ou en multisite, vérifiez la portée de l'outil avant d'interpréter ce qui apparaît dans les tables.

Pour finir, validez le site public, l'administration, les utilisateurs, les commandes et les tâches. Gardez la sauvegarde pendant la période d'observation. S'il faut restaurer, coordonnez les nouvelles écritures pour ne pas perdre les commandes ou les modifications postérieures à la sauvegarde.

Cela peut aussi vous aider

Quelque chose cloche ou a changé ? Racontez-nous et nous le vérifions.