WordPress est un outil gratuit très populaires pour créer un site web ou un blog. Il est bien conçu mais il y a parfois des fonctionnalités peu utiles qui peuvent abalourdir la base de données. Pour gagner en performance et alléger cette base de données, il est possible d’effectuer quelques requêtes SQL de maintenance bien pratiques pour purger les informations peu utiles ou même plus du tout utilisées. Cet article présente une liste de requêtes SQL qui seront sûrement utile aux personnes qui possèdent un site sous WordPress.
Prérequis
Attention, ces requêtes ont été testées au moins pour la version 3.5 de WordPress, mais rien ne dit qu’elles seront toujours opérationnelles dans le futur, si la structure de WordPress évolue. Dans tous les cas, il est vivement recommandé d’effectuer une sauvegarde (un backup) des tables WordPress avant d’utiliser une des requêtes présentées ici.
Information pratique : par défaut toutes les tables WordPress sont préfixées par “wp_”. Toutefois, lors de l’installation il est possible de modifier ce préfixe, notamment pour des raisons de sécurité. Si vous avez modifié les préfixes, il faudra penser à adapter les requêtes présentés sur cet article.
Alléger la table des articles en supprimant les révisions
Par défaut WordPress enregistre un article qui est en train d’être édité toutes les X secondes. Par ailleurs, à chaque fois que l’auteur sauvegarde un article, l’outil ajoute un enregistrement dans la base de données. On peut alors imaginer que pour 10 articles visibles sur un blog, il y peut-être 50 articles enregistrés en base. Si vous n’avez pas besoins de tout cela et que vous souhaitez purger la liste des révisions, il est possible d’effectuer la requête suivante:
DELETE a,b,c FROM `wp_posts` a LEFT JOIN `wp_term_relationships` b ON (a.ID = b.object_id) LEFT JOIN `wp_postmeta` c ON (a.ID = c.post_id) WHERE a.post_type = 'revision';
Purger les commentaires de spam
Les spams de commentaires sont courant sur un blog WordPress. Tous les commentaires qui ont été classé dans les spams peuvent être supprimés de temps en temps pour alléger la base. Pour cela, il est possible d’utiliser cette requête:
DELETE FROM `wp_comments` WHERE `comment_approved` = 'spam';
Pour supprimer tous les commentaires en attentes de modération, il suffit d’utiliser la même requête en remplaçant ‘spam’ par ‘0’. Cela peut être utile lors d’une très grosse attaque de spam de commentaires. Et pour supprimer tous les commentaires publiés, il faut remplacer ‘spam’ par ‘1’.
Purger les données meta de commentaires supprimés
Il se peut que l’ont supprime des commentaires, comme par exemple avec la requête qui supprime les spam. Or, la table “wp_commentmeta” peut conserver inutilement des données liés à des commentaires qui n’existe plus. Pour s’assurer de ne garder que des données meta de commentaires existants, il convient d’effectuer cette requête:
DELETE FROM `wp_commentmeta` WHERE `comment_id` NOT IN ( SELECT `comment_id` FROM `wp_comments` )
Supprimer les entrées liées à Akismet
Très gourmand en espace disque, le plugin Akismet génère plusieurs données meta par commentaires. En supprimant ces données et particulièrement ceux liées à des spams qui ont été supprimés, il est possible d’économiser plusieurs Mo de données peu utiles.
DELETE FROM `wp_commentmeta` WHERE `meta_key` LIKE '%akismet%'
Purger les données meta des articles qui n’existent plus
Si l’ont supprime des articles, il peut y avoir des données meta liées qui ne sont plus du tout utiles. Pour les supprimer et potentiellement gagner plusieurs Mo sur une base de données, il est possible d’utiliser cette requête:
DELETE pm FROM `wp_postmeta` pm LEFT JOIN `wp_posts` wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL
Supprimer tous les pingbacks
Si un blog ne souhaite plus afficher les pingbacks dans les commentaires, alors ils peuvent tous être supprimés en 1 seule requête:
DELETE FROM `wp_comments` WHERE `comment_type` = 'pingback';
Supprimer un shortcode dans le contenu d’un article
Les shortcodes sont très pratiques pour ajouter des fonctionnalités spécifique à l’intérieur d’un article. Toutefois, il est fastidieux de devoir modifier tous les articles manuellement pour en supprimer un qui viens d’être supprimé. Pour en supprimer un, il suffit d’effectuer la requête suivant, en l’adaptant avec le nom du shortcode à supprimer:
UPDATE `wp_post` SET `post_content` = REPLACE(`post_content`, '[vieux_shortcode]', '' );
Supprimer un champ personnalisé
Il est possible de supprimer un champ personnalisé sur l’ensemble des articles où il est utilisé, en une seule requête. Pour supprimer un meta, il faut utiliser cette requête, à adapter avec le nom du champ personnalisé à supprimer:
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'meta_a_supprimer';
Supprimer les mots-clés non-utilisés
Les mots-clés, aussi appelé “tag”, peuvent être assez nombreux sur un blog. Au fil du temps, si des articles sont supprimer ou s’ils dé-référence certains mots-clés, il peut y avoir des mots-clés qui ne sont associés à aucun article. Pour purger ces mots-clés qui ne sont plus utilisés par les articles, il convient d’utiliser les 3 requêtes suivantes:
DELETE FROM `wp_terms` WHERE `term_id` IN ( SELECT `term_id` FROM `wp_term_taxonomy` WHERE `count` = 0 ); DELETE FROM `wp_term_taxonomy` WHERE `term_id` NOT IN ( SELECT `term_id` FROM `wp_terms` ); DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN ( SELECT term_taxonomy_id FROM wp_term_taxonomy );
Purger le cache des flux
Par défaut WordPress enregistre un cache des flux (RSS, ATOM …). Pour purger ce cache et ainsi libérer un grand nombre d’enregistrement de la table wp_options, il est possible d’effectuer cette requête:
DELETE FROM wp_options WHERE option_name LIKE ('_transient%_feed_%')
Supprimer les vieux articles
Pour certains type de blog évènementiel, il convient de supprimer du contenu dépassé. Même si ce n’est pas recommandé en terme de référencement sur Google, il est possible de supprimer tous les vieux articles, vieux d’il y a plus de 365 jours (à adapter) grâce à cette requête:
DELETE FROM `wp_posts` WHERE `post_type` = 'post' AND DATEDIFF(NOW(), `post_date`) > 365
Il est aussi possible de supprimer les articles à partir d’une date, plutôt qu’à partir d’un nombre de jours. Pour cela, il faut privilégier cette requête:
DELETE FROM `wp_posts` WHERE `post_type` = 'post' AND `post_date` < '2010-12-31 23:59:59'
Supprimer l’information du “user agent” de chaque commentaire
Par défaut WordPress enregistrement le user agent de chaque visiteur qui laisse un commentaire. Cela permet d’avoir des informations utiles sur les visiteurs, notamment pour connaître les navigateurs les plus utilisés. Sur un blog de soutient informatique, ça peut même aider le blogueur à comprendre la configuration informatique du visiteur, dans un soucis de support informatique. Toutefois, dans la majorité des autres cas, cette information est superflue et prend de la place sur la base de données. Pour supprimer l’information des user agent pour les commentaires déjà enregistrés, il convient d’effectuer cette requête:
UPDATE `wp_comments` SET `comment_agent` = '';
Plus de requête ?
Si vous connaissez d’autres requêtes qui permettent d’alléger la base de données et de purger des données peu utiles, vous pouvez les partager dans les commentaires de cet article.
Très sympa ce recueil de requêtes pour nettoyer un peu sa base de données WordPress au cours du temps!
Il existe également quelques plugins pour ceux qui préfèreraient, plutôt que d’effectuer les requêtes manuellement: par exemple WP Optimize (suppression des brouillons, des révisons d’articles et des spams), ainsi que Plugins Garbage Collector (pour supprimer des données laissées dans la base par d’anciens plugins désinstallés…)
Et en complément pour des sauvegardes automatiques de sa base de données, le plugin BackWPup est plutôt complet avec pas mal d’options (mail, FTP, cloud, …): http://www.airdecker.net/sauvegarder-wordpress-facilemement-avec-le-plugin-backwpup/
URGENT !!!!!!!!
Bonjour,
j’aimerais avoir la requête sql pour afficher les titre des articles, les contenus, leurs photos principales d’une catégorie à choix.
Afficher selon la date de création; les plus récents – plus vieux
Merci !
Je refait entièrement mon wordpress, en le nettoyant de fond en comble et je peu confirmer que sur la version 3.8.1 l’ensemble des requêtes qui sont globales fonctionne toujours ;)
Bonjour,
Merci pour ça, après m’être fait spammer par semalt.semalt.com j’en avais bien besoin!
Bonne continuation :)
Jean
De très bons conseils qui aideront le plus grand nombre. Merci.
Celle là peut servir aussi :
DELETE FROM `wp_options` WHERE `option_name` LIKE (‘%_transient%_feed_%’)