Requêtes SQL pour nettoyer une base de données WordPress

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.

Logo WordPress

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

Ce contenu a été publié dans WordPress.

A propos de l'auteur : Tony Archambeau

Fort de plusieurs années d'expérience dans le développement web, Tony partage ses connaissances sur des projets divers dont le site infowebmaster.fr. Il est possible de le suivre sur Twitter.
Partager

6 réflexions au sujet de « Requêtes SQL pour nettoyer une base de données WordPress »

  1. Airdecker dit :

    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/

  2. Carlo dit :

    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 !

  3. LudlowFx dit :

    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 ;)

  4. Jean dit :

    Bonjour,

    Merci pour ça, après m’être fait spammer par semalt.semalt.com j’en avais bien besoin!

    Bonne continuation :)

    Jean

  5. Aurélien dit :

    De très bons conseils qui aideront le plus grand nombre. Merci.

  6. madvic dit :

    Celle là peut servir aussi :
    DELETE FROM `wp_options` WHERE `option_name` LIKE (‘%_transient%_feed_%’)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.