WordPress permet la création de nouveau statut mais la doc n’est pas super détaillée. Et ajouter un nouveau custom status dans wordpress peut être un peut déroutant. J’ai relevé quatre étapes où il faut intervenir pour faire fonctionner notre nouveau statut.
Voici donc un exemple avec un nouveau statut « Archive ».
Création du nouveau statut
Sur le hook init, on va simplement exécuter la fonction native de WordPress register_post_status().
//Création du nouveau statut add_action( 'init', 'register_archive_status' ); function register_archive_status() { register_post_status( 'archive', array( 'label' => 'Archive', 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Archive <span class="count">(%s)</span>', 'Archive <span class="count">(%s)</span>' ), ) ); }
Afficher le nouveau statut dans les options d’édition du post
Ici c’est un peut différent de d’habitude. On va injecté le statut dans le select en utilisant javascript. Nous allons utiliser les hooks admin_footer-post.php et admin_footer-post-new.php pour injecter le javascript.
Vous pouvez noter la présence d’une condition en ligne 9. Cette condition nous permet d’utiliser notre nouveau statut uniquement sur les posts de type « offre » ( c’est un custom post type ).
Si vous souhaitez utiliser votre nouveau statut partout, supprimez la condition.
//Afficher le nouveau statut dans les options d’édition du post add_action('admin_footer-post.php', 'append_post_status_list'); add_action('admin_footer-post-new.php', 'append_post_status_list'); function append_post_status_list() { global $post; $complete = ''; $label = ''; if($post->post_type == 'offre'){ if($post->post_status == 'archive'){ $complete = " selected='selected'"; $label = ' Archivé'; } echo ' <script> jQuery(document).ready(function($){ $("select#post_status").append("<option value=\'archive\' '.$complete.'>Archive</option>"); $("#post-status-display").append("'.$label.'"); }); </script> '; } }
Afficher le statut dans la liste des posts
Maintenant nous allons affiché « Archivé » a coté du titre des posts, de la même façon qu’avec le statut « brouillon ».
Pour ça, on va venir se greffer sur le filtre « display_post_states ».
//Afficher le statut dans la liste des posts add_filter( 'display_post_states', 'display_archive_state' ); function display_archive_state( $states ) { global $post; $arg = get_query_var( 'post_status' ); if($arg != 'archive'){ if($post->post_status == 'archive'){ return array('Archivé'); } } return $states; }
Dans la zone d’edition rapide
Maintenant il nous reste à compléter la zone d’édition rapide dans la liste des posts. Ici on va utiliser le hook « admin_footer-edit.php »
Vous pouvez noter la présence d’une condition en ligne 6. Cette condition nous permet d’utiliser notre nouveau statut uniquement sur les posts de type « offre » ( c’est un custom post type ).
Si vous souhaitez utiliser votre nouveau statut partout, supprimez la condition et la ligne 5.
//Dans la zone d’edition rapide add_action('admin_footer-edit.php','status_into_inline_edit'); function status_into_inline_edit() { global $post_type; if($post_type == 'offre') { echo "<script> jQuery(document).ready( function() { jQuery( 'select[name=\"_status\"]' ).append( '<option value=\"archive\">Archive</option>' ); }); </script>"; } }
Et voilà, c’est fini pour le backoffice. Mais vous pouvez aussi utiliser le nouveau statut dans vos wp_query.
$args = array( 'post_status' => array( 'archive', ... ) ); $query = new WP_Query( $args );
J’espère que cela vous sera utile!