mysql-ruban

WordPress stocke les données (articles, pages, catégories, etc.) dans une base de données MySQL. Il est donc utile de connaître certaines requêtes pour intervenir rapidement et de façon massive. A ne pas mettre entre toutes les mains toutefois !

N.B : cet article regroupe 22 23 requêtes MySQL pour le CMS WordPress. Avant toute intervention dans votre base de données, faites une sauvegarde préalable. Vous êtes responsable de vos actions !

Mise à jour du 24/05/2014 : les requêtes 5 et 6 ont été corrigées grâce à Julien Maury et son insistance sur presque un an pour me bouger à prendre le temps de vérifier. Merci à lui !

Avertissements

Utilisation de phpMyAdmin

Pour exécuter les requêtes listées ici vous devez être capable de vous connecter à phpMyAdmin, un outil généralement accessible depuis l’administration de votre hébergeur (via cPanel ou Plesk par exemple).

Rendez-vous ensuite dans l’onglet SQL correspondant à la base de données préalablement sélectionnée dans la partie gauche de l’interface.

Si vous n’avez jamais utilisé phpMyAdmin, faites très attention ! Vous pourriez tout supprimer en 1 clic de souris, je dis bien un !

Préfixe de la base wp_

Pour chacune des requêtes ci-dessous, n’oubliez pas de remplacer le préfixe wp_ par celui correspondant à votre base de données MySQL.

Il est fort probable que vous n’ayez pas gardé le préfixe par défaut comme il est recommandé par souci de sécurité.

Sauvegarde de votre base

Avant toute intervention dans phpMyAdmin, faites une sauvegarde de votre base MySQL en suivant le tutoriel pour savoir comment sauvegarder automatiquement la base de données MySQL.

Requêtes sur les custom fields

#1 – Ajouter un custom field à tous les articles et pages

INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT ID AS post_id, 'MonCustomField'
AS meta_key, 'MaValeur' AS meta_value FROM wp_posts
WHERE ID NOT IN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'MonCustomField');

Cette requête ajoute un champ personnalisé (custom field) à tous les articles présents dans la base.

Pensez à remplacer MonCustomField par le nom du champ en question et MaValeur par la valeur de votre choix.

#2 – Ajouter un custom field dans les articles uniquement

INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT ID AS post_id, 'MonCustomField'
AS meta_key, 'MaValeur' AS meta_value
FROM wp_posts WHERE ID NOT IN
(SELECT post_id FROM wp_postmeta WHERE meta_key = 'MonCustomField')
AND `post_type` = 'post';

La même chose que précédemment – avec les mêmes conseils, mais pour les articles seulement.

#3 – Ajouter un custom field dans les pages uniquement

INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT ID AS post_id, 'MonCustomField'
AS meta_key, 'MaValeur' AS meta_value
FROM wp_posts WHERE ID NOT IN
(SELECT post_id FROM wp_postmeta WHERE meta_key = 'MonCustomField')
AND `post_type` = 'page';

La même chose que précédemment – avec les mêmes conseils, mais pour les pages seulement.

#4 – Supprimer un custom field de tous les articles et pages

DELETE FROM wp_postmeta WHERE meta_key = 'MaValeur';

Cette requête a déjà été expliquée dans le tutoriel Supprimer des champs personnalisés (custom fields) dans WordPress.

#5 – Supprimer un custom field de tous les articles uniquement

DELETE pm
FROM wp_postmeta pm
LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
WHERE wp.post_type =  'post'
AND pm.meta_key =  'MonCustomField'

Idem que précédemment mais pour les articles uniquement.

#6 – Supprimer un custom field de toutes les pages uniquement

DELETE pm
FROM wp_postmeta pm
LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
WHERE wp.post_type =  'page'
AND pm.meta_key =  'MonCustomField'

Idem mais pour les pages seulement.

#7 – Changer la valeur d’un custom field

UPDATE `wp_postmeta`
SET `meta_value` = REPLACE(meta_value, 'AncienneValeur', 'NouvelleValeur')
WHERE `meta_key` LIKE 'MonCustomField';

Remplacez AncienneValeur par la valeur à modifier et NouvelleValeur par la valeur qui doit prendre la place de l’ancienne.

Précisez également le custom field concerné en modifiant MonCustomField.

Requêtes sur les révisions

#8 – Effacer l’historique des révisions d’articles et de pages

DELETE FROM `wp_posts` WHERE `post_type` = 'revision'

Cette requête supprime le versionning de vos articles et de vos pages ; autrement dit, les sauvegardes d’état du contenu.

Pour en savoir plus et aller plus loin en spécifiant une date avant suppression, rendez-vous sur le tutoriel Supprimer les révisions d’articles de WordPress.

#9 – Rechercher les articles d’une catégorie donnée

SELECT post_title FROM wp_posts p
JOIN wp_term_relationships r ON r.object_id = p.ID
JOIN wp_term_taxonomy t ON r.term_taxonomy_id = t.term_taxonomy_id
JOIN wp_terms terms ON terms.term_id = t.term_id
WHERE t.taxonomy ='category'
AND terms.name = 'NomCatégorie'
AND p.post_type = 'post';

Cette requête liste les articles présents dans une catégorie déterminée par NomCatégorie.

#10 – Modifier le statut de publication de vos articles d’une catégorie donnée

UPDATE wp_posts p
JOIN wp_term_relationships r ON r.object_id = p.ID
JOIN wp_term_taxonomy t ON r.term_taxonomy_id = t.term_taxonomy_id
JOIN wp_terms terms ON terms.term_id = t.term_id
SET p.post_status = 'publish'
WHERE t.taxonomy ='category'
AND terms.name = 'NomCatégorie'
AND p.post_type = 'post';

Comme précédemment, remplacez le mot-clé NomCatégorie par la catégorie concernée et indiquez le statut de publication de votre choix dans SET p.post_status = ‘publish’ ; soit publish, pending ou draft.

Requêtes de statistiques

#11 – Nombre d’articles publiés en 2010

SELECT COUNT(*) FROM wp_posts WHERE post_status="publish"
AND post_date BETWEEN '2010-01-01' AND '2010-12-31';

Cette requête vous retournera le nombre d’articles parus au cours de l’intervalle de temps défini. N’oubliez pas de formater vos date à l’anglaise et inversant l’ordre du type année, mois, jour.

#12 – Nombre total de commentaires pour vos articles en 2010

SELECT SUM(comment_count) FROM wp_posts WHERE post_status="publish"
AND post_date BETWEEN '2010-01-01' AND '2010-12-31' GROUP BY post_status;

Cette requête MySQL vous renvoie la somme des commentaires validés au cours de l’année 2010. Là encore, vous pouvez varier l’intervalle de temps ou même supprimer la période pour obtenir le total de commentaires – total qui est affiché dans le Tableau de bord de WordPress.

#13 – Top 10 des articles les plus commentés en 2010

SELECT post_title,comment_count FROM wp_posts WHERE post_status="publish"
AND post_date BETWEEN '2010-01-01' AND '2010-12-31'
ORDER BY comment_count DESC LIMIT 0,10;

Cette commande affiche la liste des 10 articles ayant reçu le plus de commentaires en 2010.

#14 – Top 10 des meilleurs commentateurs sur votre site en 2010

SELECT comment_author,COUNT(comment_count) AS F01
FROM wp_comments,wp_posts WHERE comment_approved=1
AND comment_post_ID=ID AND comment_date BETWEEN '2010-01-01'
AND '2010-12-31' GROUP BY comment_author ORDER BY F01 DESC LIMIT 0,10;

Renvoies la liste des 10 lecteurs ayant le plus commenté sur votre site en 2010.

Une nouvelle fois, vous pouvez faire varier l’intervalle de temps.

De là à créer un widget pour afficher le Top commentateur… il n’y a qu’un pas !

Requêtes sur les URLs de WordPress

#15 – Changer l’URL du site et l’URL d’installation (Siteurl et Homeurl)

UPDATE wp_options
SET option_value =
replace(option_value, 'http://www.vieuxsite.fr', 'http://www.nouveausite.fr')
WHERE option_name = 'home' OR option_name = 'siteurl';

WordPress stocke le chemin absolu de l’URL de votre site et de l’accueil dans la base de données.

Si vous transférez celui-ci d’un serveur local vers un hébergement en ligne, votre site ne fonctionnera car les URLs d’installation pointeront vers les dossiers locaux.

Cette requête est donc là pour résoudre ce problème.

#16 – Changer GUID

UPDATE wp_posts
SET guid = REPLACE (guid, 'http://www.vieuxsite.fr', 'http://www.nouveausite.fr');

Après avoir migré votre blog à partir d’un serveur local sur votre serveur en ligne, ou d’un ancien domaine vers un nouveau domaine, vous aurez besoin de réparer les URLs pour le champ GUID dans la table wp_posts. Un point crucial pour convertir correctement vos permaliens en cas d’erreurs de saisie.

#17 – Changer les URLs de contenu

UPDATE wp_posts
SET post_content =
REPLACE (post_content, 'http://www.vieuxsite.fr', 'http://www.nouveausite.fr');

Pour rappel, les liens présents dans vos articles et pages de WordPress sont inscrites en chemin absolu dans la base de données – et non pas en relatif. Vous devez donc là encore indiquer l’adresse du nouveau site.

#18 – Changer le chemin des images seulement

UPDATE wp_posts
SET post_content =
REPLACE (post_content, 'src="http://www.vieuxsite.fr', 'src="http://amazon.nouveausite.fr');

Si vous avez décidé de basculer vos images dans le cloud computing avec Amazon CloudFront par exemple, il est nécessaire de changer massivement les liens pointant vers chacune de vos images.

Il est également nécessaire de mettre à jour le GUID des fichiers joints :

UPDATE wp_posts
SET  guid = REPLACE (guid, 'http://www.vieuxsite.fr', 'http://amazon.nouveausite.fr')
WHERE post_type = 'attachment';

#19 – Mettre à jour les meta de vos articles

UPDATE wp_postmeta
SET meta_value = REPLACE
(meta_value, 'http://www.vieuxsite.fr','http://www.nouveausite.fr');

De la même façon que les requêtes d’URLs précédentes, celle-ci agira sur les différentes informations insérées dans vos articles comme les custom fields pour mettre à jour les adresses.

Requêtes administratives

#20 – Modifier le compte utilisateur admin

UPDATE wp_users SET user_login = 'Nouveau pseudo' WHERE user_login = 'Admin';

Très utile, cette commande permet de changer le pseudo du compte admin créé par défaut. Cette requête n’est plus utile pour les dernières versions de WordPress qui permette une telle chose dès l’installation.

#21 – Remettre à zéro le mot de passe

UPDATE wp_users SET user_pass = MD5( 'nouveau_mot_de_passe' )
WHERE user_login = 'votre_pseudo';

Utilisez cette requête pour modifier à votre convenance le mot de passe de n’importe quel utilisateur WordPress. Il suffit d’indiquer le nouveau mot de passe et le nom de l’utilisateur concerné.

Pour en savoir plus, rendez-vous sur le tutoriel Modifier le mot de passe d’un utilisateur WordPress via phpMyAdmin.

#22 – Supprimer les commentaires en attente de modération

DELETE from `wp_comments` WHERE `comment_approved` = '0';

Envoyez cette requête pour supprimer la totalité des commentaires qui n’ont pas encore été validés. Utile dans certains cas de spamming importants !

#23 – Supprimer les informations relatives à Akismet (plugin anti-spam de WordPress)

DELETE FROM wp_commentmeta WHERE meta_key LIKE « %akismet% »

Cette requête supprime les informations d’Akismet. Elle a été proposée par Daniel Roch de SEOMIX dans les commentaires de cet article. En voici son explication :

Cela supprime les informations d’Aksimet. A chaque fois qu’une commentaire est contrôlé, Akismet ajoute en base des informations sur la véracité du commentaire : validé ou spam. Il peut aussi rajouter « signalé comme par spam par UTILISATEUR » ou encore « marqué comme légitime par UTILISATEUR ».

Mais une fois validé, inutile de garder ces informations en base de données, surtout avec plusieurs milliers de commentaires.

Merci à lui !

Sources

Cette liste a été constituée à partir de nombreux articles trouvés au fil de mes recherches Google et d’anciens tutoriels sur WordPress Channel.

Tout le mérite revient donc à ses auteurs passionnés de WordPress pour leur travail !

Cette liste de requêtes MySQL pour le CMS WordPress n’est sans doute pas exhaustive ! N’hésitez pas à proposer vos propres requêtes pour qu’elles soient ajoutées dans cet article.

51 commentaires

  1. Joli travail de compilation !

    Pour contribuer, je remplacerais peut être

    post_date BETWEEN ‘2010-01-01′ AND ‘2010-12-31′

    par un plus simple

    year(post_date) = 2010

  2. Je confirme aussi les dire de Richnou : un year(post_date) = 2010 est plus simple à utiliser (et à recopier).

    Pour ce qui est de supprimer les commentaires en attente de modération, WordPress le fait par défaut dans une des options de l’administration.

    Ceci dit, c’est un excellent article que voilà. Beau boulot.

  3. Bonjour! Super article! Par contre, pourriez-vous m’indiquer comment importer des articles directement à partir de mysql?
    Merci par avance

  4. Pas mal. La liste est relativement complète et intéressante.

    J’en rajouterai une : supprimer tout information d’Akismet sur les commentaires, surtout pour les commentaires déjà validés (cela peut réduire de plusieurs Mo une base de données WordPress). Par contre, je ne la retrouve plus…

  5. Cela supprime les informations d’Aksimet. A chaque fois qu’une commentaire est contrôlé, Akismet ajoute en base des informations sur la véracité du commentaire : validé ou spam. Il peut aussi rajouter « signalé comme par spam par UTILISATEUR » ou encore « marqué comme légitime par UTILISATEUR ».

    Mais une fois validé, inutile de garder ces informations en base de données, surtout avec plusieurs milliers de commentaires.

  6. Bonjour, intéressant ! Je cherche une solution pour remplacer post_date par les valeurs contenues dans un custom field (en migrant de Joomla vers WordPress, j’ai perdu le contenu de post_date mais j’ai pu importer les dates dans un custom field). Auriez-vous une suggestion ? Merci d’avance !

  7. Excellentes ressources techniques !
    Par contre, j’essaie de trouver des articles pouvant m’aider à traiter ma base de données WordPress (transformé en vrai CMS) chargé de custom_types et custom_fields pour une exportation en SQL ou tableur excel pour d’autres utilisations (tri, filtre, etc.)
    Donc, WordPress va me servir de frontoffice et publication « limitée » et cette base exportée contiendrait toutes les données.
    Merci d’avance pour les suggestions et réponses dans ce sens.

  8. excellente ressource technique. très utile notamment pour l’update mysql de la base sql pour faire la passerelle entre un serveur local et un serveur réel, les liens des images dans les articles présentant en général une anomalie. c’est la commande #18 – Changer le chemin des images seulement. merci à vous.

  9. Très bien, c’est ce que je cherchais depuis pas mal de temps… surtout que j’ai eu, par le passé, pas mal de soucis avec les requêtes MSQL. Une requête mal saisie peut dégénérer en gloubiboulga géant dans la base… :-))

  10. Bonjour
    je te serais reconnaissant de me souffler la requête qui me permettrait de mettre à zéro le champ correspondant à « A propos de l’auteur » en une seule opération… Pour des raisons inexplicables je n’arrive pas à m’en débarrasser sous le thème MANTRA. Finalement, en vider le contenu me va aussi mais je suis trop frileux dès qu’il s’agit de BD.
    Merci pour ce que tu as déjà partagé.
    Cdt
    Guy
    Je m’avance mais je crois que je fais allusion à
    Table lpc_usermeta
    umeta_id = 4
    meta_key = description

  11. Bonjour,
    Apres une mauvaise manipulation du plugin better wp security, je n´arrive plus à acceder a ma page Admin, en fait quand je mets http://www.monblog/wp-admin/ il indique page introuvable…

    Je me suis risquée a manipulé ma base de donnée chez ovh…j´ai repéré le plugin sous cette appelation bwps lockout et bwps log, je les ai supprimés…sans succes! Je me dit autant supprimer tous les plugins pour être tranquile…à moins qu´il y est une autre solution?

    J´ai également éssayé via filezilla mais je n´ai que le plugin akismet..les autres je ne les ai pas repéré…enervant tout ca d´autant plus que je suis débutante et que ca fait un mois que je tiens mon blog sans pb et maintenant tout est à refaire!!! Peut être que vous avez une solutions…merci d´avance!

    1. Si vous avez une sauvegarde du FTP + base de données c’est possible de restaurer. Mais effectivement, il ne faut pas installer des plugins dédié à la sécurité sans comprendre ce que cela implique. Toujours lire les documentations. En développement Web, les boutons annuler l’opération n’existent pas.

      C’est difficile de vous aider à ce point étant donné que vous avez effectué de nombreuses actions… mais essayez de restaurer une base de données en supprimant au préalable le dossier du plugin concerné ainsi que le fichier .htaccess (fichier invisible) à la racine du FTP. C’est peut-être lui le responsable du blocage d’accès à l’admin.

  12. Bonjour, j’aurai une petite question par rapport aux URLs, quel est la requête à effectuer pour supprimer des articles par rapport à leur URLs ? ou par rapport à une partie de l’url (par exemple avec « -2/ » dans l’url (articles en double lors d’une importation wordpress :/)
    merci d’avance et encore merci pour tous ces tutoriels de très bonne qualité !

  13. Salut, je regarde les articles les plus populaires SQL sur WordPress avant de sortir le volume 2 du mien pour limiter les doublons.

    J’ai relevé quelques erreurs dans le tien comme par exemple sur les custom fields – y a pas de colonne post_type dans la table postmeta mais on peut relier avec la table post via l’id des posts qui lui est présent en tant que colonne.

    a++

      1. Certain ! Y a pas de colonne post_type dans postmeta c’est dans la table post qu’elle se trouve et comme je l’ai mis dans l’autre commentaire, ça se fait relativement simplement en reliant via les ID de post

  14. Salut !!
    Tout d’abord merci pour ton blog hyper précieux qui est une mine d’information pour les astuces wordpress !
    J’explique ma situation, Les images de mon site n’apparaissent pas…
    Dans la rubrique média de wordpress, lorsque j’upload, le chemin apparait bon (www.moinsite.fr/wp-content/uploads/…), mais à la lecture lorsque j’inspecte l’élément, je m’aperçois qu’il m’indique un autre chemin (www.monsite.fr/wordpress/wp-content/uploads/…).

    J’ai migré mon site wordpress de local à serveur distant, et j’ai bien effectué le changement de nom de bdd et ses identifiants.
    J’ai aussi bien redirigé mon site qui était avant ‘www.monsite.fr/wordpress’ en ‘www.monsite.fr’ (le fichier .htaccess est bon aussi apparemment.)
    En regardant dans ma bdd à la table wp-posts j’ai vu les GUID qui notifiaient un chemin d’image ‘www.monsite.fr/wordpress/wp-content/uploads’ j’ai donc fait une requête mysql afin de changer ce chemin.
    Mais toujours rien, les images n’apparaissent toujours pas…

    Comment puis je résoudre ce problème ?
    Merci infiniment !

  15. Bonjour,
    Super article merci beaucoup !
    J’y ai trouvé beaucoup de réponse. cependant, je reste bloqué sur un élément. j’ai crée un champ personnalisé « repeater » dans mes articles et j’aimerais créer une fonction capable d’aller récupérer les contenus des tableaux spécifiques à chacun des articles pour aller les afficher dans d’autres pages. Est-ce possible ? Existe-t-il une requête pour ça ? Pourriez-vous m’apporter votre aide ?
    Merci beaucoup !

  16. Le code que vous fournissez pour changer le chemin des images seulement, je dois l’insérer où exactement ? Dans wp_posts, j’ai un bout de code dans un encadré :
    SELECT *
    FROM `wp_posts`
    LIMIT 0 , 30

    Je dois effacer tout ce code pour le remplacer par le vôtre ?

    et si en plus de ça, je dois changer changer les URLs de contenu, comment vais je faire ? L’un en dessous de l’autre… enfin je ne sais pas.

    1. La méthode consiste à cliquez sur le nom de votre base de données dans phpMyAdmin. Une fois que vous voyez sa structure, cliquez sur SQL puis collez les requêtes une par une. Autrement dit, il faut les exécuter l’une après l’autre en prenant soin de modifier les informations saisies.

      Toujours faire une sauvegarde préalable !

      1. Bonsoir et bravo pour tout le travail effectué.
        J’utilise WP3.8 et woocommerce.
        J’ai exporté mes produits par l’outil export de wp et importer mes produits woocommerce par ce même outil d’import
        Tout est là, mais mais mes photos de produits sont avec les anciennes url. j’ai dupliqué les photos dans le répertoire upload de mon nouveau WP, mais je n’arrive pas à trouver à quel endroit je peux changer le chemin des photos produits de mon nouveau wp

        une idée ?

        Et bonne année à tous !

  17. 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 !

  18. Bonjour à tous,

    je suis en pleine migration TypePad > WP et je recherche une requête SQL pour ajouter « .jpg » à la fin des URLs de mes images insérées dans les Posts : TypePad ne les inclus pas dans ses URLs…

    Merci d’avance pour votre aide.

  19. Bonjour
    Après l’importation d’une base je voudrais mettre toutes les images déjà dans des articles à la une
    Cela est il possible via une requête ou une autre solution requête ?
    Merci
    Manuel

      1. Dans le cadre d’un refonte d’un site j’ai installé wordpress, un thème et un plugin permettant la mise à la une des images.
        Pour les nouveaux articles pas de souci en mettant les images à la une, elles apparaissent dans les extraits.
        Par contre j’ai importé 1000 articles de l’ancien site. J’ai bien les images dans les articles mais pas dans les extraits car elles ne sont pas a la une.
        J’ai cherché en vain dans la base un champ concerné pour faire une requête et les mettre toute à la une mais ne trouve pas de champ pour cela.
        Je pense passer a côté de quelque chose !
        Merci de votre aide

    1. Google Chrome comporte un bug sur les polices. Si vous vidait à fond votre cache, ça devrait à nouveau fonctionner suite à un correctif appliqué ce weekend. Beaucoup de sites sont impactés…

  20. Vous nous avez donné les requêtes SQL sans nous donner les variables php WordPress qui gère ça, à la rigueur pour les champs…etc on peut regarder les tables non ?

  21. jaimerais aussi savoir comment récupérer les éléments de la commande d’un client qui a choisi un paiement paypal dans sa base de donnée wordpress