WordPress fonctionne avec une base de données MySQL. Toutes les données WordPress telles que les messages, les commentaires, les catégories et les paramètres sont stockés dans cette base de données MySQL.
Découvrez le schéma de la base de données WordPress sur le codex.wordpress.org.
Sauvegarder votre base de donnees WordPress
En préambule et avant de procéder à toute modification, pensez à sauvegarder votre base de données! Vous pouvez télécharger le plugin WP-DBManager pour sauvegarder votre base de données via WordPress.
Voici la procédure manuelle de sauvegarde via phpMyAdmin :
- Connectez-vous à phpMyAdmin
- Sélectionnez votre base de données WordPress
- En haut, cliquez sur Export
- Sélectionnez toutes les tables
- Sélectionnez SQL pour exporter au format .sql
- Cochez la case ” Enregistrer comme fichier”
- Choisissez le type de compression gzip
- Enfin, cliquez sur OK
Comment effectuer des requetes SQL ?
Le moyen le plus simple pour exécuter l’une des requêtes ci-dessous est d’utiliser phpMyAdmin. Le plugin SQL Executioner vous permet également d’exécuter des requêtes directement depuis l’admin WordPress.
Voici comment utiliser phpMyAdmin :
- Se connecter à son interface phpMyAdmin
- Sélectionnez votre base de donnée WordPress
- Cliquez sur l’onglet SQL
- Copiez/Collez les requêtes que vous souhaitez exécuter
ATTENTION : Toutes les requêtes utilisées dans cet article partent du principe que votre préfixe de table est “wp_”, à savoir, le préfixe standard pour les tables WP lors de l’installation WordPress. Si vous utilisez un préfixe de table différent (et c’est conseillé en terme de sécurité;), pensez à modifier les requêtes en conséquence.
Requêtes SQL WordPress pratiques & utiles
Changer le chemin des images
Vous avez décidé d’utiliser un CDN tel qu’Amazon, après avoir créé le CNAME, utilisez la requête ci-après pour changer le chemin de vos images vers le CDN.
UPDATE wp_posts SET post_content = REPLACE (post_content, 'src="https://www.anciensiteurl.com', 'src="https://votrecdn.nouveausiteurl.com');
Vous devrez également changer le GUID des images jointes :
UPDATE wp_posts SET guid = REPLACE (guid, 'http://www.anciensiteurl.com', 'http://votrecdn.nouveausiteurl.com') WHERE post_type = 'attachment';
Changer le Nom d’Utilisateur par Defaut “Admin”
Chaque installation WordPress par défaut crée un compte avec un nom d’utilisateur “Admin” par défaut. Cela peut être un problème de sécurité car un pirate peut plus facilement forcer votre admin WordPress.
UPDATE wp_users SET user_login = 'Votre-Nouveau-Nom' WHERE user_login = 'Admin';
Changer le mot de passe
Besoin de changer ou de réinitialiser votre mot de passe dans WordPress, voire même celui des autres utilisateurs ?
UPDATE wp_users SET user_pass = MD5( 'nouveau_mot_passe' ) WHERE user_login = 'votre-username';
Assigner tous les articles de l’auteur A à l’auteur B
Si vous souhaitez transférer les articles de l’auteur A vers l’auteur B, il serait très long de la faire, article par article. Utilisez la requête SQL suivante. Vous devrez d’abord obtenir l’ID des 2 auteurs en allant sur les profils utilisateurs depuis votre panneau d’administration WordPress. Cliquez sur les noms des auteurs pour voir leur profil. Dans la barre d’adresse, cherchez ” user_id “.
UPDATE wp_posts SET post_author = 'nouvel-auteur-ID' WHERE post_author = 'ancien-auteur-ID';
Effacer les revisions
Chaque changement ou modification sous WordPress provoque un enregistrement dans la base de données, voici un moyen très simple de les supprimer.
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'
Effacer les Metas des articles
Lorsque vous supprimez un plugin certaines informations restent en base de données (post_meta_table). Réduisez la taille de votre base avec cette requête SQL:
DELETE FROM wp_postmeta WHERE meta_key = 'votre-meta-key';
Exporter les emails des commentateurs
Récupérez les adresses mails des commentateurs de votre blog :
SELECT DISTINCT comment_author_email FROM wp_comments;
Effacer les Pingback
Trop de pingback? Voici comment les supprimer :
DELETE FROM wp_comments WHERE comment_type = 'pingback';
Effacer tous les commentaires Spam
Vous avez de nombreux commentaires classés spam ? Effacez-les en une fois :
DELETE FROM wp_comments WHERE comment_approved = 'spam';
- 0 = En attente de modération
- 1 = Approuvé
- Spam = Marqué comme spam
Identifier les Tags inutilises
Voici comment identifier les tags non utilisés sur votre WordPress :
SELECT * From wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count=0;
Desactiver les commentaires pour les vieux articles
Si vous ne voulez plus modérer les commentaires de vos vieux articles, vous pouvez désactiver les commentaires de ces derniers en fonction d’une date, utilisez la requête suivante :
UPDATE wp_posts SET comment_status = 'closed' WHERE post_date < '2012-01-01'
Retirer les caracteres illisibles
Vous avez des problèmes d’encodage de caractères ? Au lieu de nettoyer vos articles et commentaires un-à-un, voici une série de requêtes à lancer pour les remplacer.
UPDATE wp_posts SET post_content = REPLACE(post_content, '“', '“'); UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€', '”'); UPDATE wp_posts SET post_content = REPLACE(post_content, '’', '’'); UPDATE wp_posts SET post_content = REPLACE(post_content, '‘', '‘'); UPDATE wp_posts SET post_content = REPLACE(post_content, '—', '–'); UPDATE wp_posts SET post_content = REPLACE(post_content, '–', '—'); UPDATE wp_posts SET post_content = REPLACE(post_content, '•', '-'); UPDATE wp_posts SET post_content = REPLACE(post_content, '…', '…'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, '“', '“'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€', '”'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, '’', '’'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, '‘', '‘'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, '—', '–'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, '–', '—'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, '•', '-'); UPDATE wp_comments SET comment_content = REPLACE(comment_content, '…', '…');
Desactiver tous vos plugins WordPress
Une requête permettant de désactiver l’ensemble de vos plugins :
UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins';
Chercher et remplacer du contenu dans vos articles
Pour remplacer facilement un contenu par un autre, utilisez cette requête SQL :
UPDATE wp_posts SET 'post_content' = REPLACE ('post_content', 'Ancien_Texte', 'Nouveau_Texte');
Supprimer et/ou remplacer un Shortcode dans vos articles
Les shortcodes WordPress c’est toujours pratique mais quand on change son thème WordPress, il arrive parfois qu’ils ne soient plus compatibles. Même requête SQL que celle ci-dessus, cette dernière permet de supprimer ou remplacer vos Shortcodes caduques.
UPDATE wp_post SET 'post_content' = REPLACE ('post_content', '[AncienShortcode]', 'Rien ou NouveauShortcode' ) ;
Yep… Bon rappel que tout cela.
Pour le backup, tant qu’à faire, si tu les envoies sur phpMyAdmin, autant faire le dump directement depuis cette interface. Ou mieux, faire une copie de la base sous un nouveau nom.
Comme ça, en cas de plantage, tu supprimes la base foirée, tu renommes ta copie, et en voiture Simone ! Ni vu, ni connu, et hop, ton site repart comme en 40′.
Une requête utile pour dégonfler sa base quand on utilise l’extension Akismet :
DELETE FROM `wp_commentmeta` WHERE `meta_key` LIKE ‘Akismet%’
Un commentaire sur le blog entraînant trois enregistrements de Akismet dans la table wp_commentmeta, celle-ci finit par être lourde.
très utile :-)
Sinon j’aime bien ton formulaire de commentaires qui se déplie et la connexion via facebook, twitter, wordpress… c’est géré par un plugin tout ça ?
Merci ;)
Commentaires gérés par JetPack !
Merci Christophe, ta requête pour Askimet est pas mal.
je viens de supprimer 30 Mo de Meta inutiles
Terriblement utiles, ces petites requêtes ! Je stocke l’article dans mon portfolio Evernote, ça me sera utile un de ces 4 :-)
L’article mériterait d’être mis à jour régulièrement pour 1/ rester à jour (version WP, format de table, …) et 2/ et être complété par de nouvelles requêtes.
Depuis WordPress 3.0, il n’y a plus d’utilisateur par défaut prédéfini. On le définit soi-même comme un grand.
Depuis WordPress 3.0 toujours, on ne peut plus redéfinir le mot de passe d’un utilisateur via un MD5() inséré dans la base de données. Cela ne fonctionne tout simplement pas. Le codex de WordPress fournit des méthodes de réinitialisation alternatives.
Plus généralement, il est fortement déconseillé d’accéder directement à la BDD. En effet, sa structure peut changer. Il est donc vivement recommandé de passer soit par le Tableau de bord, soit par l’API RPC, soit par l’API PHP. Ce n’est qu’en dernier recours que l’on doit se rabattre sur les accès SQL directs.
Merci beaucoup pour tous ces rappels et petites astuces qu’on peut effectuer sur la base de données. C’est toujours bien utiles ;)
Yes, je suis 100% d’accord, JetPack est un indispensable pour la gestion des commentaires sur WP. A installer de toute urgence pour ceux qui ne l’ont pas !
Merci !
Mmm comme évoqué dans un de mes derniers billets (sur les mots de passe), le seul moyen que j’ai eu de changer le mien (trop simple) en un autre plus complexe, ça a été la modification de la clef dans la base, directement dans la table des utilisateurs vu que WP ne voulait pas de mont mot de passe.
Et c’est ce qui est décrit dans le codex.
@Gilles, je plussoie, j’ai également eu recours à cette technique sur le site d’un client… Alors déconseillé certes, mais bien pratique quand même;)
Bah la logique voudrait que l’on puisse mettre ce qu’on veut sur son propre WP. Même un chiffre ou une lettre. Je n’aime pas qu’on décide pour moi. Sachant qu’en plus le mot de passe est assez complexe mais qu’il n’est pas “strong” pour WP.
‘fin bon chaque CMS a ses casseroles :)
Je suis d’accord avec Martin1975, il est fortement déconseillé de balancer des requêtes sur la base de données d’un outil sauf si on maitrise parfaitement son modèle de données (lien entre les tables, implication exacte de la présence de telle donnée à tel endroit).
Il se peut que cette bidouille marche dans une installation précise avec une version précise mais selon les plugins ou la configuration du site, il se peut qu’une modification dans un autre contexte fasse n’importe quoi.
Certaines “bidouilles” comme l’histoire du CDN ou une base d’article massivement polluée par des caractères accentées foireux… ok et parce qu’il n’y a pas d’autres solutions mais supprimer les révisions à la main ou encourage les utilisateurs à nettoyer “régulièrement” leur base de données en SQL, ça ne me parait pas du tout être un bon conseil ou une bonne pratique.
Si les développeurs développent des APIs au dessus, s’il y a des plugins et des interfaces, ce n’est pas pour rien, il n’y a pas de filet de sécurité en SQL et dès qu’un projet est un peu conséquent on perd vite la connaissance complète, les couches placées au dessus du SQL sont là pour aider l’humain à gérer toute cette complexité.
Vous avez très judicieusement indiqué de toujours sauvegarder la base avant ce genre de manip, il serait bien de préciser qu’elles sont plus de l’ordre du dernier recours que de la norme (hors power users qui se font plaisir à exécuter du SQL … :)
un programmeur avec des années de métier qui ne laisserait *jamais* ces clients voir ses collègues bidouillés les bases de données à la main
Moi j’avais un autre que j’ai bidouiller moi même pour supprimer les article ne double… C’est surtout pour ceux qui utilise les fameux “Crawler”
Merci beaucoup pour ce tutoriel. Mon site sous WordPress est en pleine expansion et comme tout webmaster, mon souci est de me réveiller un matin et voir tout mon travail parti en fumée. Malgré que je fais des sauvegardes à partir de l’interface WordPress, je pense que l’idée de sauvegarder la base de données est la meilleure.
La requête sur les tags inutilisé n’est pas fiable en l’état, car le compteur (count) utilisé comme critère ne tient pas en compte les articles privés ; je suppose qu’il ne prend pas non plus en compte les brouillons. Bref, il faudrait une requête un peu plus complexe que je n’ai malheureusement pas le temps de mettre au point ce soir.
Comme on l’a déjà dit plus haut, il faut bien avoir confiance qu’une requête valable un jour peut ne plus l’être plus tard si le modèle de données WP évolue. Mais c’est effectivement bien pratique. Pour les utilisateurs avertis (ou joueurs).
Quant à l’extension Askimet qui pourrit les bases de données en les alourdissant inutilement, c’est limite irresponsable d’avoir fait ça. J’ai atteint les limites de mon (petit) hébergement à cause de ça.
IL y a cette extension wordpress qui permet d’executer des requetes SQL sans se connecter ) PHPmyadmin : WP MySQL Console http://wordpress.org/extend/plugins/wp-mysql-console/
sans se connecter… ? Les screenshots semblent indiquer le contraire… Si il y a connections, généralement c’est risqué en terme de sécurité.
Merci pour l’article qui ouvre des horizons pour un débutant sous WP, et pour l’info concernant les commentaires avec Jetpack. Je vais tester…
Je vais vérifier car je ne l’active que lorsque j’ai besoin. Je pense qu’elle choppe directement les infos de connections dans le fichier de config de wordpress.
Dès que je l’active j’ai accès à la console directement. Je ne me rappelle pas avoir rentrée les identifiants à l’installation (à vérifier car ça doit faire 1 an).
Tout d’abord, merci pour ces requêtes qui sont indispensables…
J’en profite pour vous demandez : comment prendre la première image d’un article wordpress et la mettre comme “Image à la une” en requête SQL et cela pour n’importe quel article ?
Merci de votre aide…
Fx, c’est le genre de choses que tu peux faire via le fichier function.php. Il te suffit d’ajouter la bonne fonction dans le fichier en question. La fonction, tu peux la trouver ici par-exemple : http://wpchannel.com/miniature-automatique-premiere-image-wordpress/
Merci Sébastien… Cela fonctionne-t-il uniquement pour les nouveaux articles ou aussi pour les archives ?
Certaines requêtes SQL sont très utiles, notamment celles qui permettent de rediriger des URLs de pages web et des URLs d’images dans le cadre d’une migration de blog par exemple.
Pour la migration d’un blog, je préconise une méthode plus radicale et finalement assez simple et qui marche avec les hébergements mutualisés:
1/ Export SQL via PhpMyAdmin
2/ Edition du fichier SQL dans un éditeur puissant (par exemple Notepad++, mais pas Notepad)
3/ Rechercher/remplacer de la chaîne “mon.ancienblog.fr” par “mon.nouveaublog.eu”
4/ Importation du fichier résultat (compressé gz sinon ça risque de ne pas passer) via PhpMyAdmin
C’est ce que j’utilise aussi pour travailler sur une version locale de mon blog (avec WAMP).
C’est que des requêtes utiles que je vois ici. Tout peut être utile un jour où l’autre.
Juste un petit mot concernant la requête pour renommer le nom d’utilisateur par défaut. Cette requête est IN-DIS-PEN-SA-BLE. J’ai travaillé sur un petit plugin de sécurité WordPress qui envoi un email à chaque fois que quelqu’un à échoué à se connecter à la partie administrateur et j’ai constaté qu’il y a beaucoup de tentative de connexion effectué par des robots automatisés, souvent installé dans des pays tels que la Pologne. C’est scripts essaient de se connecter avec le nom d’utilisateur “admin” ou “test” ou “aaa”. Donc pour éviter de leur faciliter la tâche il faut vraiment personnaliser le nom d’utilisateur et avoir un mot de passe un peu sécurisé (évitez les mots de passe “azerty” par exemple).
Si vous souhaitez constatez cela par vous, vous pouvez installer le plugin “WP Security Login Notification” (disponible sur le site WordPress : http://wordpress.org/extend/plugins/wp-security-login-notification/ ).
En espérant que cela aide.
@Tony oui, il y a beaucoup de tentative de connexion effectué avec le mot “manager” aussi :) why not !…
Bojour et merci pour ces scripts.
Pour certaines (les remplacements de chaînes notamment) j’ai dû remplacer les ‘ ‘ par des ` `… pour que ce soit pris en compte.
Voilà, voilà, si comme moi vous avez une “SYNTAX ERROR…” ! :)