Ajouter une boite (meta box) dans le back-office de wordpress

Pour ajouter une boite dans le back-office de wordpress (typiquement, pour administrer un champ personnalisé de façon un peu plus sexy que l’interface de base), on peut utiliser la fonctionnalité de WordPress add_meta_box.

L’ajout d’une méta box se fait en 3 étapes :

1 – Déclaration de la boite
2 – Création de l’interface
3 – Actions à affectuer lors de la sauvegarde du post.

A noter que cela fonctionne aussi bien pour des types natifs (posts et pages) que pour des customs posts types.

Déclaration de la boite

function pages_admin_menu() {
	add_meta_box('my_box','Mon libellé', 'mon_libelle_meta_box', 'page', 'normal', 'core');
}
add_action( 'admin_menu', 'pages_admin_menu' );

Lors de la création du menu de l’administration, on appelle la fonction pages_admin_menu, qui ajoute une méta box via la fonction add_meta_box. Cette fonction prend comme arguments :
- L’id de la boite
- Le libellé qui apparait sur l’interface
- La fonction qui génère le html de l’interface
- Le type de post (post, page ou nom d’un custom post)
- L’endroit de la page où l’interface doit apparaitre (‘normal’, ‘advanced’, ou ‘side’)
- La priorité d’affichage de la boite (‘high’, ‘core’, ‘default’ ou ‘low’)

Création de l’interface

C’est notre fonction précédemment définie, mon_libelle_meta_box, qui s’en charge. Ici, nous mettons un simple champ texte, mais on peut évidemment personnaliser cette partie en mettant un select, une checkbox…

function mon_libelle_meta_box(){
	global $post;
?>

;
<?php
}

Actions à affectuer lors de la sauvegarde du post

Nous devons maintenant préciser que faire de notre champ lorsqu’on sauvegarde le post :

function mybox_save_postdata( $post_id ) {
  // ne rien faire en auto-save
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
      return;

  // vérification des droits permissions
  if ( 'page' == $_POST['post_type'] )
  {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return;
  }
  //ajouter éventuellement des vérifications pour les custom post types

  if(isset($_POST['my_box']))
  	update_post_meta($post_id, 'my_box', $_POST['my_box']);
  	//paramètres : id du post, nom du champ perso, valeur (en post)

}
add_action( 'save_post, 'mybox_save_postdata' );