Supprimer, modifier ou insérer du contenu dans WordPress

Si vous utilisez WordPress, et l’expérience prouve que vous auriez tort de vous en priver, le contenu que vous créez et mettez à jour depuis l’administration est stocké dans la base de données.

Ce couple PHP/Mysql sur lequel WordPress s’appuie permet justement la gestion et la mise à jour des contenus de manière simplifiée.  On arrête là le blabla pour passer à ce qui nous intéresse : les modifications massives.

Le changement c’est maintenant

Vous devez supprimer, ajouter, remplacer des URLs, du contenu, des shortcodes, etc. Si vous n’avez publié qu’un seul post, il est préférable d’aller le modifier directement dans l’édit. Mais ce cas de figure est assez peu probable.

La plupart du temps, vous aurez besoin de faire des changements massifs qui concernent des dizaines de posts. Donc soit vous êtes résignés et vous réservez votre soirée, soit vous utilisez la puissance de mysql pour appliquer vos changements partout en une seul fois.

Cas pratique : virer un shortcode

Hier j’ai eu recours à quelques requêtes SQL après avoir supprimé un plugin de coloration syntaxique. Ce plugin demandait d’insérer un shortcode dans tous les posts et pour chaque bout de code que l’on désirait afficher ce qui me convenait mal. Or je ne me voyais pas éditer chacun de mes posts (le blog est récent mais j’en ai déjà plus de 80).

J’ai donc pensé à une requête SQL pour enlever tous mes shortcodes et les remplacer par de bonnes vieilles balises code;

UPDATE wp_posts SET POST_CONTENT = replace(POST_CONTENT, '[code type="php"]', '');

*wp est le préfix __ par défaut_ des tables lors de l’installation de WordPress, remplacez par celui que vous avez choisi.

Un modèle applicable partout

Il est possible de généraliser cette méthode à d’autres sections comme les commentaires :

UPDATE wp_comments SET COMMENT_CONTENT = replace(COMMENT_CONTENT, '[code type="php"]', '')

S’il s’agit de supprimer totalement le shortcode sans le remplacer, il suffit de remplacer par un vide comme suit:

UPDATE wp_comments SET COMMENT_CONTENT = replace(COMMENT_CONTENT, '[code type="php"]', '');

Se débarrasser des caractères bizarres

Vous avez peut-être déjà eu ce genre de parasites dans votre base de données : •, – et tutti quanti. Personnellement ça me dérange, du coup je sévis :

UPDATE wp_posts SET post_content = REPLACE(post_content, '…', '…');

Il faut dupliquer la requête en la modifiant à chaque fois pour autant de caractères bizarres et ce, également dans les commentaires car en général les deux tables wp_posts et wp_comments sont touchées.

Ne pas oublier d’oublier le GUID

Le “Globally Unique Identifier” est l’identifiant de vos posts, par définition unique. J’allais inclure le changement de GUID lors d’un changement de domaine quand j’ai lu ceci :

Even if you shift domains around, the post is still the same post, even in a new location. Feed readers being shifted to your new feeds when you change URLs should still know that they’ve read some of your posts before, and thus the GUID must remain unchanged.

Never, ever, change the contents of the GUID column, under any circumstances.

source: codex

Et il est vrai que le changement de GUID n’est pas nécessaire pour faire fonctionner les URLs après changement de domaine. De ce que j’ai compris, et j’espère ne pas commettre d’erreurs, le GUID du post reste le même car on a juste changé d’endroit. Le post, lui, reste le même.

Le codex insiste sur le fait de laisser le GUID d’origine même après migration vers un autre domaine. Il fait tout de même une exception pour les posts de type attachment.

Ainsi si vous devez changer le répertoire des uploads pour vos médias, le GUID changera donc si vous faites une requête du style :

UPDATE wp_posts SET post_content = REPLACE(post_content,'www.domain.com/wp-content/uploads','www.domain.com/images');

Il faudra penser à faire :

UPDATE wp_posts SET guid = REPLACE(guid,'www.domain.com/wp-content/uploads','www.domain.com/images');

Conclusion

Vous avez une méthode simple pour des modifications massives sur vos contenus.