[WordPress] Ajouter (ou supprimer) un champ personnalisé à tous les billets (SQL)


Les champs personnalisés dans WordPress peuvent être utilisés pour porter toutes sortes de valeurs et ajouter des comportements, des informations ou autres sur la plateforme. L’utilisation du plugin Advanced Custom Fields en facilite d’ailleurs grandement la gestion et l’utilisation.

Le gros problème, c’est que si notre besoin évolue en cours de route, et que le blog comporte des centaines, voire des milliers de billets, ajouter les champs personnalisés un-à-un n’est pas envisageable.

 
Voici une requête SQL pour ajouter un champ personnalisé à tous les billets (ou types de billets).
Cette requête est optimisée pour ne pas ajouter une deuxième fois ce champ aux billets le portant déjà (car ce n’est pas interdit dans WordPress).

INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT ID AS post_id, 
       'NomDeMonCustomField' AS meta_key, 
       'ValeurDeMonCustomField' AS meta_value
FROM wp_posts 
WHERE ID NOT IN
	(SELECT post_id 
	 FROM wp_postmeta 
	 WHERE meta_key = 'NomDeMonCustomField')
AND post_type = 'post'; // type de billets

Si vous utilisez des Custom Post Types, il vous suffit de personaliser la requête en changant le type dans AND post_type = 'post';

Par exemple, si vous avec un CPT video, dans lequel vous souhaitez ajouter un champ personnalisé duree ayant pour valeur 1:00, la requête sera :

INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT ID AS post_id, 
       'duree' AS meta_key, 
       '1:00' AS meta_value
FROM wp_posts 
WHERE ID NOT IN
	(SELECT post_id 
	 FROM wp_postmeta 
	 WHERE meta_key = 'duree')
AND post_type = 'video';

Toujours pratique à connaitre, cela m’a récemment épargné des heures de travail ingrat.

 
Pour supprimer ce champ, en cas d’erreur (et oui, ça n’a pas été immédiat ;) ) ou si vous n’en avez plus besoin, la requête suivante fera l’affaire :

DELETE FROM wp_postmeta WHERE meta_key = 'NomDeMonCustomField';

Enjoy !

PS: j’ai fait le postulat que vos bases ont pour préfixe wp_; ce n’est pas le cas chez moi.

PS2: ah au fait, comme d’habitude, faite un backup de vos bases avant de réaliser une quelconque opération.