Performances et surveillance
Requêtes SQL pour nettoyer les données orphelines et purger la base de données de WordPress
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
- Améliorer les performances de la base de données de WordPress avec Index WP MySQL For Speed Évaluez les index de WordPress avec Index WP MySQL For Speed, vérifiez les modifications avant de le...
- Diagnostiquer les requêtes LEFT JOIN lentes dans WordPress Analysez les requêtes de taxonomies lentes avec LEFT JOIN, comparez plans et alternatives sur une co...
- Optimiser la table wp_options et les données de type « autoload » Requêtes SQL pour mesurer les données autoload de wp_options, repérer les options les plus volumineu...
- Accélérer et optimiser WordPress et WooCommerce étape par étape Guide complet pour accélérer WordPress et WooCommerce : PHP et OPcache, cron, LiteSpeed Cache config...
Quelque chose cloche ou a changé ? Racontez-nous et nous le vérifions.