Jouons avec les meta-boxes !

Les custom metas box sont des boîtes que vous pouvez rajouter dans les pages d’édition de contenu, dans l’administration de WordPress. Grâce à elles nous pouvons enregistrer des informations relatives à un article, à une page, ou à n’importe quel élément d’un Custom Post Type. Cela permet par exemple de renseigner l’URL d’un élément de portfolio, ou bien encore le prix d’un article… Pour résumer c’est une méthode plus clair pour renseigner des valeurs que l’on saisirai habituellement via des custom-fields.

Les metaboxes (et les metadonnées) offrent énormément de possibilités quand à la personnalisation de notre CMS favori. Il faut tout de même veiller à les utiliser correctement et à ne pas les substituer à un système de taxonomie ou tout autre fonctionnalité native de WordPress qui serait plus pertinente.

Les usages étant multiples et les possibilités tellement étendues, un article ne suffira pas à traiter la question. Je vais donc aujourd’hui me contenter de vous présenter la fonctionnalité à travers des exemples relativement simples. Puis dès demain je vous montrerai le fonctionnement de meta boxes plus complexes…

wordpress metabox
Les meta boxes décuplent les possibilités de WordPress

Comment faire une metabox ?

L’ajout des metaboxes peut se faire de deux manières : soit via le fichier functions.php de votre thème, soit par l’intermédiaire d’un plugin. Dans les deux cas le code sera le même. La création d’une metabox se fait en trois étapes, tout d’abord…

Il faut initialiser la metabox

La première chose à faire est d’initialiser la metabox. On informe WordPress qu’une boite va être ajouté dans la page d’édition d’un type de contenu. Cette étape à lieu lors de l’appel des différentes metaboxes, il faut donc commencer par le add_action qui convient :

add_action('add_meta_boxes','initialisation_metaboxes');
function initialisation_metaboxes(){

}

Le code compris dans la fonction initialisation_metaboxes() sera maintenant exécuté lors de l’initialisation de l’admin. Nous pouvons maintenant utiliser la function add_meta_box() pour ajouter notre metabox.

add_action('add_meta_boxes','initialisation_metaboxes');
function initialisation_metaboxes(){
  //on utilise la fonction add_metabox() pour initialiser une metabox
  add_meta_box('id_ma_meta', 'Ma metabox', 'ma_meta_function', 'post', 'side', 'high');
}

Cette fonction requiert 4 arguments + 3 arguments optionnels :

  1. Le premier correspond à l’identifiant unique de la metabox.
  2. Le second correspond au titre de la metabox, tel qu’il s’affichera dans l’admin.
  3. Le suivant désigne la fonction qui va nous permettre de construire la metabox.
  4. Le quatrième désigne le type de contenu concerné ( post | page | custom post type… )
  5. Le cinquième (optionnel) indique son emplacement dans la page d’édition (normal (au centre) ou side (dans la colonne latérale) ou advanced)
  6. Le sixième (optionnel) correspond à sa priorité (high | core | default | low). C’est à dire, en gros, à la position verticale de cette boîte.
  7. Pour finir, le dernier argument (optionnel) est un tableau correspondant aux valeurs qui seront passé à la fonction de construction de la metabox. Par défaut seul l’objet $post est transmit.

On construit notre metabox

Après avoir initialisé notre metabox, il faut que l’on fasse la fonction qui va la constituer (celle là même que nous avons appelé en argument 3 de add_meta_box).
Cette fonction peut être mise n’importe où…

Pour prendre un exemple clair, cette metabox permettra d’enregistrer une simple chaine de texte. Il y a donc besoin d’un label et d’un champ texte.

function ma_meta_function(){
  echo '<label for="mon_champ">Mon champ : </label>';
  echo '<input id="mon_champ" type="text" name="mon_champ" />';
}

Mais cela ne suffit pas, car il faut que l’on puisse récupérer la valeur précédemment enregistrée.
Si on omet les œufs de caille, notre « meta_value » disparaitra après chaque sauvegarde…

On appelle donc l’objet $post puis via get_post_meta on récupère la valeur sauvegardée.

Il ne nous reste qu’à renseigner cette valeur dans le value du champ input:text.

Je passe volontairement rapidement sur get_post_meta, nous y reviendront plus tard.

function ma_meta_function($post){
  // on récupère la valeur actuelle pour la mettre dans le champ
  $val = get_post_meta($post->ID,'_ma_valeur',true);
  echo '<label for="mon_champ">Mon champ : </label>';
  echo '<input id="mon_champ" type="text" name="mon_champ" value="'.$val.'" />';
}

On sauvegarde les données de la metabox

La dernière étape consiste en la sauvegarde des données. Si on l’oublie, ça ne risque pas de marcher…

Celle-ci à lieu lors de la sauvegarde d’un post. Il faut donc appeler une nouvelle fonction lors de cet évènement.

Le add_action correspondant est save_post. Chose pratique : notre fonction prend directement en argument l’ID du contenu en cours d’enregistrement.

add_action('save_post','save_metaboxes');
function save_metaboxes($post_ID){

}

Maintenant il faut faire un test pour savoir si la metabox existe bien sur le contenu en cours de sauvegarde.

Pour cela on test la présence de la variable poussé en post (le name de l’input:text). Si elle existe on sauvegarde sa valeur via la function update_post_meta(), en lien avec la «meta_key» qui lui correspond.

On aurait aussi pu utiliser la fonction add_post_meta(), qui sert normalement à ça. Mais lorsque la «meta_key» n’existe pas, la fonction update_post_meta() fait le même travail…

Donc voilà, il s’agit juste d’un petit raccourci.

Après niveau performance, je ne sais pas si cela varie beaucoup.

add_action('save_post','save_metaboxes');
function save_metaboxes($post_ID){
  // si la metabox est définie, on sauvegarde sa valeur
  if(isset($_POST['mon_champ'])){
    update_post_meta($post_ID,'_ma_valeur', esc_html($_POST['mon_champ']));
  }
}

La fonction update_post_meta() accepte 4 argument (3 obligatoire et 1 facultatif) :

  1. L’ID du contenu auquel on associe cette meta.
  2. La meta_key correspondant à la valeur que l’on sauvegarde. Vous remarquerez qu’elle commence par un underscore. Les meta_key qui commencent ainsi ne s’affichent pas dans les custom fields…
  3. Le troisième argument correspond à la valeur que l’on souhaite enregistrer. Le «esc_html» permet de nettoyer la valeur, pour ne pas enregistrer n’importe quoi… («esc_html» sert juste à encoder les caractères qui pourraient interférer avec du html)
  4. Le dernier argument est optionnel et correspond à la valeur précédente (au cas où il y aurait plusieurs «meta_key» identiques liées à ce contenu. Si c’est le cas et que cet argument n’est pas présent, toutes les «metakey» seront supprimées)

Comment ressortir les données enregistrées via une metabox ?

Maintenant voyons comment nous pouvons procéder pour ressortir les valeurs que nous avons enregistré avec nos metaboxes.

Il n’y a, en fait, aucune différence entre les manières de ressortir des valeurs sauvegardés par le biais de champs personnalisés ou bien par le biais de meta box.

Il s’agit pour WordPress du même type de données : à une «meta_key» correspond une ou plusieurs «meta_value».
Chaque «meta_key» étant liée à un article, nous avons deux possibilités pour récupérer nos données.

Via la fonction get_post_meta()

Il s’agit de la fonction prévue par WordPress a cet effet. Cette fonction prend 3 paramètres :

  1. L’ID du contenu dont on veut récupérer la métadonnée
  2. La meta_key dont on veut la (les) valeur
  3. Le type de retour attendu : chaîne ou tableau (true ou false).

Le troisième paramètre nécessite peut être d’avantage d’explications.

S’il y a plusieurs «meta_key» identiques pour le même contenu, avec des valeurs différentes et que le troisième paramètre est à true, la valeur retournée sera seulement la première trouvée, sous forme de chaîne. S’il est à false (ou non-précisé), la valeur retournée sera un tableau contenu l’ensemble des meta_values.

Par exemple si j’ai trois valeurs associées à la même «meta_key» et au même contenu :

$val = get_post_meta($post->ID,'_ma_valeur',true);
// $val renverra 'la valeur de mon champ'
$val = get_post_meta($post->ID,'_ma_valeur',false);
// $val renverra array('la valeur de mon champ','la seconde valeur', 'une autre valeur')

Via une requête directe en base de donnée

Des fois (nous verrons ça dans les meta box avancées), la fonction get_post_meta() ne nous suffira pas, il faudra alors faire une requête SQL directement en base de donnée.

Pourquoi ? Tout simplement parce que la fonction get_post_meta() présente une lacune : l’ordre dans lequel sont renvoyés les valeurs. Nous n’avons aucun contrôle dessus.

Ainsi lorsque nous voudrons ressortir les meta values dans un ordre précis (par exemple par ordre de meta_id), nous ferons cette requête :

//vals correspond au tableau qui nous sera renvoyé
$vals= '';
$sql = "SELECT m.meta_value FROM ".$wpdb->postmeta." m where m.meta_key = '_ma_valeur' and m.post_id = '".$post->ID."' order by m.meta_id";
$results = $wpdb->get_results( $sql );
foreach( $results as $result ){
  $vals[] = $result->meta_value;
}

Maintenant nous maîtrisons l’ordre de sortie. Cela peut paraître un peu inutile aujourd’hui, mais nous en reparlerons demain…

Quelques metaboxes de base

La metabox de type texte

Voici par exmeple une meta box qui nous permettra d’enregistrer l’URL d’un site créé, dans un Custom Post Type «portfolio» :

add_action('add_meta_boxes','init_metabox');
function init_metabox(){
  add_meta_box('url_crea', 'URL du site', 'url_crea', 'portfolio', 'side');
}

function url_crea($post){
  $url = get_post_meta($post->ID,'_url_crea',true);
  echo '<label for="url_meta">URL du site cré :</label>';
  echo '<input id="url_meta" type="url" name="url_site" value="'.$url.'" />';
}

add_action('save_post','save_metabox');
function save_metabox($post_id){
if(isset($_POST['url_site']))
  update_post_meta($post_id, '_url_crea', esc_url($_POST['url_site']));
}

La metabox de type select

Voici une metabox avec un champ select, qui permet de renseigner, sur une fiche produit (Custom Post Type «produit»), sa disponibilité :

add_action('add_meta_boxes','init_metabox');
function init_metabox(){
  add_meta_box('dispo_produit', 'Disponibilité du produit', 'dispo_produit', 'produit', 'side');
}

function dispo_produit($post){
  $dispo = get_post_meta($post->ID,'_dispo_produit',true);
  echo '<label for="dispo_meta">Indiquez la disponibilité du produit :</label>';
  echo '<select name="dispo_produit">';
  echo '<option ' . selected( 'dispo', $dispo, false ) . ' value="dispo">En stock</option>';
  echo '<option ' . selected( 'encours', $dispo, false ) . ' value="encours">En cours d\'approvisionnement</option>';
  echo '<option ' . selected( 'indispo', $dispo, false ) . ' value="indispo">En rupture</option>';
  echo '</select>';

}

add_action('save_post','save_metabox');
function save_metabox($post_id){
if(isset($_POST['dispo_produit']))
  update_post_meta($post_id, '_dispo_produit', $_POST['dispo_produit']);
}

Notez la présence de la function selected(), qui renvoie selected= »selected » si la valeur du premier paramètre est égale à celle du second.

La metabox de type checkbox

La metabox suivante sert à déterminer quels conditionnements sont proposés pour un type de contenu «vin».

On va donc utiliser des checkbox.

add_action('add_meta_boxes','init_metabox');
function init_metabox(){
  add_meta_box('conditionnement_vin', 'Conditionnements disponnibles pour ce vin', 'conditionnement_vin', 'vins', 'side');
}
// cette fonction me sert à inscrire checked, si jamais la valeur est coché
function check($cible,$test){
  if(in_array($test,$cible)){return ' checked="checked" ';}
}
function conditionnement_vin($post){
  $cond = get_post_meta($post->ID,'_conditionnement_vin',false);
  echo 'Indiquez la Conditionnements disponibles :';
  echo '<label><input type="checkbox" ' . check( $cond, 5 ) . ' name="cond[]" value="5" /> Mignonette 5cl</label>';
  echo '<label><input type="checkbox" ' . check( $cond, 35 ) . ' name="cond[]" value="35" /> Demi-bouteille 35cl</label>';
  echo '<label><input type="checkbox" ' . check( $cond, 37 ) . ' name="cond[]" value="37" /> Fillette 37.5cl</label>';
  echo '<label><input type="checkbox" ' . check( $cond, 50 ) . ' name="cond[]" value="50" /> Désirée 50cl</label>';
  echo '<label><input type="checkbox" ' . check( $cond, 75 ) . ' name="cond[]" value="75" /> Bouteille 75cl</label>';
  echo '<label><input type="checkbox" ' . check( $cond, 150 ) . ' name="cond[]" value="150" /> Magnum 150cl</label>';
}

add_action('save_post','save_metabox');
function save_metabox($post_id){
  if(isset($_POST['cond'])){
    // je supprime toutes les entrées pour cette meta
    delete_post_meta($post_id, '_conditionnement_vin');
    // et pour chaque conditionnement coché, j'ajoute une metadonnée
    foreach($_POST['cond'] as $c){
      add_post_meta($post_id, '_conditionnement_vin', intval($c) )
    }
  }
}

Il y a plusieurs choses à noter dans cette metabox. tout d’abord j’ai crée une fonction check() pour me simplifier la vie.

WordPress propose bien une fonction checked() mais elle ne permet pas de tester si une valeur est présente dans un tableau.
J’utilise donc la fonction in_array() de php… Remarquez aussi que je n’ai pas employé update_post_meta(), mais que j’ai préféré utiliser delete_post_meta() (qui supprime toutes les metadonnées pour une clé et un ID de post donné) suivie d’un add_post_meta() dans un foreach.

Une metabox pour l’adresse (meta box mixte)

J’ai oublier de préciser : une metabox peut accueillir autant de champs que l’on souhaite. Il n’est pas nécessaire de créer une metabox par information…

En revanche il faut penser à sauvegarder la valeur de chaque champ.

Par exemple une metabox pour enregistrer les informations sur un client :

add_action('add_meta_boxes','init_metabox');
function init_metabox(){
  add_meta_box('info_client', 'Informations sur le client', 'info_client', 'ouvrage', 'side');
}

function info_client($post){
  $nom      = get_post_meta($post->ID,'_nom',true);
  $prenom   = get_post_meta($post->ID,'_prenom',true);
  $civilite = get_post_meta($post->ID,'_civilite',true);
  $societe  = get_post_meta($post->ID,'_societe',true);
  $adresse  = get_post_meta($post->ID,'_adresse',true);
  $mail     = get_post_meta($post->ID,'_mail',true);
  $tel      = get_post_meta($post->ID,'_tel',true);
  ?>
  <input id="" style="width: 50px;" type="text" name="civilite" value="<?php echo $civilite; ?>" />
  <input id="" type="text" name="prenom" value="<?php echo $prenom; ?>" />
  <input id="" type="text" name="nom" value="<?php echo $nom; ?>" />
  <textarea id="" style="width: 280px;" name="adresse"><?php echo $adresse; ?></textarea>
  <input id="" type="text" name="mail" value="<?php echo $mail; ?>" />
  <input id="" type="text" name="tel" value="<?php echo $tel; ?>" />
  <input id="" type="text" name="societe" value="<?php echo $societe; ?>" />
  <?php 
}

add_action('save_post','save_metabox');
function save_metabox($post_id){
  if(isset($_POST['civilite'])){
    update_post_meta($post_id, '_civilite', sanitize_text_field($_POST['civilite']));
  }
  if(isset($_POST['prenom'])){
    update_post_meta($post_id, '_prenom', sanitize_text_field($_POST['prenom']));
  }
  if(isset($_POST['societe'])){
    update_post_meta($post_id, '_societe', sanitize_text_field($_POST['societe']));
  }
  if(isset($_POST['nom'])){
    update_post_meta($post_id, '_nom', sanitize_text_field($_POST['nom']);
  }
  if(isset($_POST['adresse'])){
    update_post_meta($post_id, '_adresse', esc_textarea($_POST['adresse']));
  }
  if(isset($_POST['mail'])){
    update_post_meta($post_id, '_mail', is_email($_POST['mail']));
  }
  if(isset($_POST['tel'])){
    update_post_meta($post_id, '_tel', esc_html($_POST['tel']));
  }
}

D’autres metaboxes à venir !

Voilà pour aujourd’hui !

Il s’agit juste des bases pour créer vos propres metaboxes, mais rassurez-vous on ne vas pas s’arrêter en si bon chemin.

Cet article servira de support à ceux qui vont suivre tout au long de la semaine et dans lesquels j’aborderai la réalisation et l’utilisation de boites relativement plus intéressantes.

Stay tuned…

Dans la série :

Contacter l'auteur :

willy bahuaud

Je suis Willy Bahuaud, intégrateur et développeur, spécialiste de WordPress.
Besoin de mes services ? Écrivez-moi !

24 commentaires

  1. Par Julio Potier (BoiteAWeb) — Il y a 5 années
    Je lis les articles à l’envers, oui je sais ^^
    L’article est très complet et va aider les débutants et mêmes certaines personnes confirmées j’en suis sûr.

    Je ne suis par contre pas fan des multiples champs pour un seul article venant su même script, tu me suis ?
    Ici pour ton adresse tu as une meta par champ alors que personnellement, je ferais un tableau avec le tout. Je veux bien ne pas tout mélanger à la limite (gps, coordonnées, etc).
    Ensuite, tu vas me (re)dire que pour pouvoir faire des meta_query c’est mieux un seul champ, c’est pas faux j’avoue, peut etre avec un like tout moche. Donc je dirais que il faut voir le besoin ou pas de faire par la suite des meta_query dessus.
    Sinon, il manque un nonce dans le save_post ;)
    Allez je RT ça, a +

  2. Par Anthony — Il y a 5 années
    Comme Julio, personnellement, je travail avec un tableau pour mes meta-box (boucle + helper pour la génération des box)

    C’est dommage ne ne pas faire un tour sur les utilisations de custom fields dans les query post, personnellement ça m’est très utile.

    @julio-potier-boiteaweb : pour le tableau c’est effectivement plus optimisé de passer par un tableau serialisé ( j’ai un faible pour JSON).

  3. Par Willy Bahuaud — Il y a 5 années
    héhé effectivement tout dépend de l’usage. Ce sera plus logique de serialiser les données si tout ce qu’on veut après c’est les afficher. Par contre si on veut les utiliser pour autre chose il vaut mieux les isoler… C’est toujours possible de faire ressortir un article selon une meta_value via un LIKE mais par contre ça ne marchera pas pour un ORDER BY ou d’autre opérations du genre.

    Donc tout dépend de ce qu’on va devoir faire avec ces données…

    Niveau perfs par contre un get_post_meta = une requête donc si on a isolé toutes ces meta_values et que l’on a besoin de toutes les obtenir dans la boucle en cours il vaut mieux utiliser un get_post_custom()

    Oui j’ai préféré d’aborder le nonce un peu plus tard dans les articles, je trouvait que ça faisait beaucoup ici…

    une boucle et un helper, c’est une bonne pratique, néanmoins si tu veux faire des metabox un peu plus complexes ça peut devenir… plus complexe ^^

    Oui on pourrai faire un tour de l’usage des meta-données dans les requêtes, c’est une très bonne idée !

    Sinon ,je suis désolé je n’ai pas compris le lien avec JSon

  4. Par Anthony — Il y a 5 années
    Pour le helper, ça vas juste dépendre du niveau de complexité de ton helper ;) pour le JSON, simple format de stockage.
  5. Par Willy Bahuaud — Il y a 5 années
    Exact pour le helper.

    Okkkkk pour le JSon 😀

  6. Par Julio Potier (BoiteAWeb) — Il y a 5 années
    « il vaut mieux utiliser un get_post_custom() »
    BEEEP bienvenue dans la 3.4 ! :
    Tu peux faire get_post_meta( $post_id ); et tu auras TOUTES les clés dans un tableau (ce qui revient à get_post_custom() qui a été modifié pour devenir un wrapper de get_post_meta() ).
    Sinon je suis d’accord sur le order by et le reste.
    A bientôt
  7. Par Willy Bahuaud — Il y a 5 années
    Lol, et voilà…. je pars en vacances une semaine et j’ai déjà une version de WordPress a rattraper… 😛

    Boutade à part, merci pour l’info !!

  8. Par Jeanmich — Il y a 4 années
    Bonsoir,

    tout d’abord merci pour cette suite de codes. Reste une question que je n’arrive pas à élucider.
    Je souhaite exploiter les métadonnées personnalisées pour permettre à mon client de changer, selon la page qu’il édite, le bandeau placé en background du menu.
    Pour info, je suis sous WP 3.4.2 et j’utilise skeleton comme base.
    Donc, j’ai créé des classes différentes et je voudrai que les classes changent selon la page qui s’affiche.
    Dans mon cas, j’interviens sur la classe du que je complète par une nouvelle classe .pageN ou N est variable selon la page.
    Mon client m’a demandé de pouvoir faire varier cette classe, sans toucher au code, au fil des créations de page.
    J’ai à disposition 5 bandeaux. Donc j’aurais ou N variera de 1 à 4. L’option par défaut étant taguée
    J’ai créé une meta boxe dans laquelle j’indique (ou pas) le chiffre qui viendra compléter page dans la définition de classe du body.
    Si la meta boxe renvoie 1, la classe du body sera complétée de page1, pour 2, la classe sera complétée de page2… etc.
    J’ai pu gérer l’extraction de cette métadonnée, et l’afficher ici ou là pour tester.
    Maintenant, je n’arrive pas à la coller en bout de définition de la balise pour appeler une nouvelle classe.
    Le définitions de classe dans functions.php.
    //Création d’une metabox choix du header

    add_action(‘add_meta_boxes’,’initialisation_metaboxes’);
    function initialisation_metaboxes(){
    //on utilise la fonction add_metabox() pour initialiser une metabox
    add_meta_box(‘id_ma_meta’, ‘Sélection d un header pour cette page ‘, ‘ma_meta_function’, ‘page’, ‘normal’, ‘high’);
    }
    function ma_meta_function(){
    $val = get_post_meta($post->ID,’_ma_valeur’,true);
    echo ‘Choix du header : ‘;
    echo  »;
    }

    add_action(‘save_post’,’save_metaboxes’);
    function save_metaboxes($post_ID){
    if(isset($_POST[‘choix_header’])){
    update_post_meta($post_ID,’_ma_valeur’, esc_html($_POST[‘choix_header’]));
    }
    }
    et j’inclus la valeur captée par la metabox dans la fonction (st_navbar()) chargée de gérer l’affichage de la balise body, de la façon suivante :

    if ( !function_exists( ‘st_navbar’ ) ) {
    function st_navbar() {
    $valeur.=’1′;
    $valeur=get_post_meta($post->ID,’_ma_valeur’,true);
    echo  »;
    wp_nav_menu( array( ‘container_class’ => ‘menu-header’, ‘theme_location’ => ‘primary’));
    echo ‘‘;
    }

    Vous l’aurez vu je me suis largement inspiré du code présenté dans l’article, mais je sèche à l’étape ultime.
    J’ai bien noté que ma bidouille intervient hors loop, c’est peut être là qu’est l’os ?
    Merci de vos avis éclairants et éclairés !

  9. Par ngita — Il y a 4 années
    Merci pour l’article, pertinent et facile à comprendre.
  10. Par tom courant — Il y a 4 années
    Bonjour,
    Super article, merci.
    Juste une question, mais je ne sais pas si c’est le bon lieux… :

    Un exemple avec des custom-post-type produits :
    Quand je crée des metabox de types select ou boutons radio dans ces custom-post-type, je recupere bien le choix sélectionner dans ma variable et j’affiche en front-end le contenus correspondant.
    Jusque la tous vas bien.

    Mais quand j’edite a nouveaux le custom-post-type, mes metabox sont a nouveaux vierge, la sélection faite préalablement n’est pas enregistrée.

    Est ce qu’il y a quelques chose a faire pour que dans mon administration mes choix soient enregistrés ?

    Merci d’avance.

    Tom.

  11. Par Jack NUMBER — Il y a 4 années
    Article très utile !
    Une petite erreur cependant, il n’y a pas de test pour cocher les cases dans l’exemple des checkbox.
  12. Par thierry — Il y a 3 années
    Bonjour,
    concernant l’exemple: La metabox de type checkbox
    Pour moi il y a un soucis ici :
    foreach($_POST[‘cond’] as $c){
    add_post_meta($post_id, ‘_conditionnement_vin’, intval($c) )
    }

    car j’ai un beau : Parse error: syntax error, unexpected ‘}’

    2 heures que je suis dessus et je sèche complètement ??

  13. Par Willy Bahuaud — Il y a 3 années
    Bonjour ,
    Il te manque simplement un point-virgule à la fin de ton add_post_meta 🙂
  14. Par darknote — Il y a 3 années
    bonjour,
    sympa l’article mais oui il y a un mais, il manques des captures d’écrans, des exemples pour voir ce que le donne, là je bloque meta box ça fait un cadre d’information dans un article ?
    Merci
  15. Par Matt — Il y a 3 années
    Bonjour,

    Il semblerait que la metabox de type checkbox ne sauvegarde pas les valeurs.

  16. Par Willy Bahuaud — Il y a 3 années
    effectivement, j’avais oublié d’utiliser la fonction check(). Le code a été mis à jour.
  17. Par Aurel' — Il y a 2 années
    Bonjour,
    Merci pour cette série d’articles très instructif. Par contre, juste une petite question pour optimiser un peu l’ensemble en cas de multiples ajouts.

    Faut-il mieux créer une seule fonction avec l’ensemble des meta box à créer ou séparer par type de contenu (post, page, …) et donc plusieurs appels « add_meta_boxes » ou « save_post » ?

  18. Par Max — Il y a 2 années
    Bonjour Willy,
    Merci pour ce super tuto, simple et efficace, c’est ce que que je recherchais pour remplacer mes custom field que je trouve moins présentable pour le client.
    Par contre je suis confronté au même problème que Matt mais pour l’exemple de base, avec des input text, ils ne semblent pas mettre en mémoire les values.
    Merci d’avance ;)
  19. Par dewy — Il y a 2 années
    bonjour,

    super tuto.

    par contre je ne vois pas comment on peut récupérer les valeurs inscrites dans les métaboxes du back office et les insérer dans le front ( post, page ou encore custom post type).

    de plus en mettant à jour la metaboxe (clic sur le bouton mettre à jour du post), les champs s’effacent et je ne comprends pas ou est ce que les valeurs sont stockées. comment faire pour faire en sorte que ces données restent dans les champs?

    merci d’avance et bravo pour la qualité de ce site

  20. Par Willy Bahuaud — Il y a 2 années
    pour récupérer les valeurs des metaboxes, il faut utiliser la fonction get_post_meta().
    Les données sont sauvegardés, dans la table des postmeta, via la fonction update_post_meta() qui s’exécute lors du hook save_post. Tu devrais vérifier cela, et aussi que tu re-affiche bien les meta dans leurs inputs, via get_post_meta 🙂
  21. Par dewy — Il y a 2 années
    merci pour cette réponse, je vais m’empresser de tester ça.

    a plus tard et bravo pour votre site

  22. Par A.A.A. — Il y a 2 années
    Bonjour, merci pour ton tuto et support très utile !
    Je souhaitais savoir s’il était possible de lier une métabox à plusieurs types de contenu (soit plusieurs custom posts).

    Peut on définir dans sa fonction  :

    
    function initialisation_metaboxes(){
      add_meta_box('display_my_metabox', 'Display my metabox', 'display_my_text', 'custom_post1, custom_post2, post, page', 'normal', 'high');
    
  23. Par A.A.A. — Il y a 2 années
    OK, I found a way to add it !
    http://codex.wordpress.org/Function_Reference/add_meta_box

    <?php
    function myplugin_add_meta_box() {
    	$screens = array( 'post', 'page' );
    	foreach ( $screens as $screen ) {
    		add_meta_box(
    			'myplugin_sectionid',
    			__( 'My Post Section Title', 'myplugin_textdomain' ),
    			'myplugin_meta_box_callback',
    			$screen
    		);
    	}
    }
    add_action( 'add_meta_boxes', 'myplugin_add_meta_box' );
  24. Par dewy — Il y a 2 années
    bonjour,

    juste pour vous signaler que tout fonctionne chez moi. j’avais des problèmes de syntaxe dans mon code donc du coup ça ne fonctionnait pas correctement.

    encore merci pour votre tuto et continuez comme ça avec votre site

Commenter