web-dev-qa-db-fra.com

register_post_status et show_in_admin_all_list

J'ai un statut de publication personnalisé qui devrait être visible par le public mais non affiché dans la liste "tous" de l'écran d'édition.

Voici comment enregistrer le statut de la publication:

register_post_status('my_custom_post_status', array(
    'label' => __('The Label', 'domain'),
    'public' => true,
    'exclude_from_search' => true,
    'show_in_admin_all_list' => false,
    'label_count' => //blablabla
));

Le show_in_admin_all_list = false devrait masquer le statut dans la liste complète, mais ce n'est pas le cas. Seulement si je mets le public à faux, ce n'est pas visible. Mais j'ai besoin de public = true!

Des idées

Codex: http://codex.wordpress.org/Function_Reference/register_post_status

5
Xaver

Cela résout mon problème:

register_post_status('my_custom_post_status', array(
    'label' => __('The Label', 'domain'),
    'public' => !is_admin(),
    'exclude_from_search' => true,
    'show_in_admin_all_list' => false,
    'label_count' => //blablabla
));

!is_admin() rend le statut uniquement public sur la page d'accueil.

Si vous trouvez une meilleure solution, postez-la ici!

8
Xaver

Mon approche, inspirée par @revaxarts, est la suivante:

if (is_admin() && $_GET['post_type'] == 'post') {
  $makepublic = true;
} else {
  $makepublic = false;
}

register_post_status( 'suspended', array(
      'label'                     => _x( 'suspended', 'Status General Name', 'myadvert' ),
      'public'                    => $makepublic,
      'exclude_from_search'       => true,
      'show_in_admin_all_list'    => true,
      'show_in_admin_status_list' => true,
      'label_count'               => _n_noop( 'Suspended <span class="count">(%s)</span>', 'Suspended <span class="count">(%s)</span>' )
 ) );

Parce que je ne veux pas voir ces publications sur le front-end alors que je suis connecté en tant qu'administrateur.

0
Spyros

Si vous ne souhaitez pas modifier le paramètre public, car vous souhaitez mieux contrôler vos publications, vous devez également associer l'action pre_get_posts pour modifier la requête principale:

/**
 * Display all posts on edit.php
 * Bug fix: the 'show_in_admin_all_list' argument for the 'register_post_status' function is ignored when the argument 'public' is set to 'false'
 * @link https://core.trac.wordpress.org/ticket/24415
 */
add_action('pre_get_posts', function($query) {
    global $pagenow;

    if (!is_admin() || $query->query['post_type'] != 'YOUR_CPT' || $pagenow != 'edit.php') {
        return;
    }

    if (!isset($_GET['post_status']) || empty($_GET['post_status']) || (isset($_GET['post_status']) && $_GET['post_status'] == 'all')) {
        $query->set( 'post_status', array('publish', 'draft', 'foo', 'bar'));
    }
});
0
Guicara