Chapitre 11 sur 20
Ajouter des champs métas personnalisés
L’ajout de champs personnalisés est incontestablement la possibilité qui confère à WordPress ses lettres de noblesse en tant que CMS. En effet, les champs personnalisés – ou métas – permettent d’enregistrer et d’organiser des données en plus du contenu principal.
Les métas – ou custom fields en anglais – existent nativement dans WordPress et de très nombreux plugins en tirent parti. Par exemple, WooCommerce utilise abondamment les métas pour stocker toutes les informations supplémentaires dont il a besoin : prix, réduction, conditions de livraison…
Métas natives
Techniquement parlant, les métas sont stockées dans une table SQL dédiée. Il existe des métas pour les posts, les commentaires, les utilisateurs et les taxonomies. Ces tables permettent d’ajouter autant d’informations que l’on veut à une entité, il suffit de spécifier l’id de l’entité à laquelle la meta se réfère, de lui attribuer une clef et une valeur. Les posts possèdent des métas, mais aussi les utilisateurs et les commentaires.
Bien entendu, nous n’avons pas besoin de connaître la manière dont WordPress gère tout cela sous le capot pour l’utiliser. L’interface d’administration propose par défaut la gestion des métas.
Pour accéder à ce panneau, il faut l’activer en cochant “options personnalisés” via “options de l’écran” dans l’éditeur classique ou “Champs personnalisés” depuis le menu “Préférences” dans Gutenberg. Ainsi, vous pouvez renseigner tout type d’information. Vous pouvez même y stocker du JSON pour des données structurées.
Par la suite, dans vos templates, vous pouvez récupérer l’information avec la fonction get_post_meta
.
$my_custom_data = get_post_meta(get_the_ID(), 'custom_data', true);
Parfois, vous voudrez aussi sauvegarder des informations directement depuis votre code. On utilisera alors la fonction update_post_meta
. Elle créé la méta si elle n’existe pas ou la met à jour si elle existe déjà. Enfin, dans le cas où vous voudriez totalement supprimer une meta, delete_post_meta
supprimera l’enregistrement.
Nous n’avons ici parlé que des métas concernant les posts (donc les pages et les articles), mais il existe des fonctions sœurs.
- Pour les commentaires :
get_comment_meta
,update_comment_meta
,delete_comment_meta
; - Pour les utilisateurs :
get_user_meta
,update_user_meta
,delete_user_meta
; - Pour les taxonomies :
get_term_meta
,update_term_meta
,delete_term_meta
.
Depuis l’administration, vous ne pouvez gérer les métas que des pages et des articles. L’accès aux métas des autres types d’éléments se fait soit directement via le code, soit via l’ajout de plugins.
Interface personnalisée
L’interface standard est très générique : on spécifie une clef et la valeur, obligatoirement via un input
de type text
. Cela peut convenir dans de nombreux cas, mais ça reste assez limité.
On pourrait en effet vouloir ajouter quelques lignes descriptives pour expliquer ce que l’on attend de l’information et utiliser d’autres types d’élements de formulaire pour recueillir les données : checkbox
, textarea
…
Pour ce faire, on aura recours à add_meta_box
.
// On créer le champ
add_action('admin_init', function () {
add_meta_box('steroids_reading_time', 'Temps de lecture', function() {
global $post; // On récupère l'objet $post
// On récupère la valeur de la méta si elle existe déjà
$reading_time = get_post_meta($post->Id, 'reading_time', true);
echo '<input type="number" name="reading_time" value="' . $reading_time . '">';
}, 'post');
});
// On sauvegarde les données
add_action('save_post', function ($post_id) {
// S'il s'agit d'ajax ou d'autosave, on ne fait rien
// On ne fait rien en cas de save Ajax
if ((defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) || (defined('DOING_AJAX') && DOING_AJAX)) {
return;
}
// Si notre méta est définie, on la sauvegarde
if (isset($_POST['reading_time'])) {
update_post_meta($post_id, 'reading_time', $_POST['reading_time');
}
});
Cette manière de faire offre toutes les fonctions et la puissance dont on peut avoir besoin. Nous avons la possibilité d’afficher du code custom et d’effectuer tout type de traitement sur les données avant de les enregistrer et de les afficher. Par exemple, on pourrait séparer la saisie des données en plusieurs champs, puis les regrouper et les sauvegarder en JSON dans une seule méta.
Le principal inconvénient de cette méthode est qu’elle demande rapidement beaucoup de code pour un besoin très courant. On souhaitera en général s’adjoindre les services d’un plugin dédié à cet usage si l’on a un besoin important des custom fields.
Les plugins de champs personnalisés
Nous l’avons constaté, les options offertes par les champs personnalisés sont assez restreintes. Dès lors un plugin couvrant 99% des besoins est fortement recommandé.
De nombreux plugins offrent des fonctionnalités similaires. Cependant, pour une fonction aussi centrale d’un site, il convient de porter une attention toute particulière au choix du plugin. Je vous en recommande quatre, qui sont tous très complets et de grande qualité.
Pods
Des quatre que je vais présenter, Pods est très certainement un des plus complets. Il permet bien entendu d’ajouter des custom fields, mais aussi de créer des custom post types depuis l’admin.
Un custom post type est un nouveau type de contenu, par exemple en plus de pages et des articles, vous pouvez ajouter le type “événements”, “produit” ou “épisode”, chacun ayant des propriétés spécifiques. Par exemple, un produit a un prix tandis qu’un épisode possède une durée, un format, des acteurs et un réalisateur.
Pods possède une API REST, est open source et dispose d’une très bonne documentation.
Custom Fields Suite
Custom Fields Suite est open source également et il est extrêmement léger. C’est celui que je recommande si vous n’avez pas besoin de 10 000 fonctionnalités.
Il est simple, rapide et fait ce qu’on lui demande, tout en conservant la rapidité native de votre back-office.
Carbon Fields
Carbon Fields est l’outil qu’il vous faut si vous aimez tout gérer depuis le code. En effet, Carbon Fields n’est pas un plugin à proprement parler, c’est une bibliothèque à installer via composer : composer require htmlburger/carbon-fields
. Une fois installé, tout se gère via une API objet moderne et expressive.
use Carbon_Fields\Container;
use Carbon_Fields\Field;
add_action('carbon_fields_register_fields', function () {
Container::make('theme_options', __('Theme Options'))->add_fields([
Field::make('text', 'crb_text', 'Text Field')
]);
});
add_action('after_setup_theme', function () {
require_once('vendor/autoload.php');
\Carbon_Fields\Carbon_Fields::boot();
});
Carbon Fields est open source, extrêmement puissant et offre tous les types de champ dont on peut avoir besoin. Il permet de créer des blocs Gutenberg. Il présente l’avantage de concentrer la définition de l’ensemble du modèle de données directement avec le reste de votre code. En revanche, les utilisateurs n’ont de ce fait pas la main sur les champs.
Advanced Custom Fields
ACF est le seul plugin payant de cette liste, bien qu’il existe aussi une version gratuite (limitée en fonctionnalités).
C’est le plugin le plus populaire dans ce domaine et la référence de facto. Il est extrêmement riche en fonctionnalités (sans être forcément meilleur que les autres) et est régulièrement mis à jour. Outre les métas, il permet par exemple également de gérer les blocs Gutenberg et de créer (via du code) des panneaux d’options.
Au delà de son API relativement complète, il se démarque surtout par sa compatibilité avec de nombreux autres plugins, tels que les plugins de traductions et une importante communauté.
Conclusion
En conclusion, aucun plugin n’est meilleur que les autres. ACF est, dans sa version payante, un des plus complets à égalité avec Carbon Fields. Ce dernier gère cependant la création des champs via le code : avantage pour certains, inconvénient pour d’autres. Ces deux solutions sont actuellement les seules à permettre la création de blocs Gutenberg.
Custom Fields Suite offre probablement la solution la plus légère de toute, inutile de sortir l’artillerie lourde pour de simples besoins. Enfin, Pods tire son épingle du jeux en étant le seul à permettre de créer des custom post types via son UI, il faut admettre que c’est un réel plus.
Sachez par ailleurs que l’usage de ces plugins peut notablement impacter les performances de votre site si vous ne faites pas attention. Nous en parlons plus en détails dans le chapitre sur les performances.
Commentaires
Rejoignez la discussion !