La vue tout affiche tous les articles, brouillons compris, dans wp-admin/edit.php
. Comment puis-je exclure les publications ayant le statut de brouillon dans la vue Tous?
Le paramètre show_in_admin_all_list
de la fonction register_post_status()
détermine si un statut de publication donné est inclus dans la vue de table All post.
La version la plus courte est probablement:
add_action( 'init', function() use ( &$wp_post_statuses )
{
$wp_post_statuses['draft']->show_in_admin_all_list = false;
}, 1 );
mais évitons de modifier les globales directement de cette façon et remplaçons le statut par défaut draft
par:
add_action( 'init', function()
{
register_post_status( 'draft',
[
'label' => _x( 'Draft', 'post status' ),
'protected' => true,
'_builtin' => true,
'label_count' => _n_noop( 'Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>' ),
'show_in_admin_all_list' => false, // <-- we override this setting
]
);
}, 1 );
où nous utilisons la priorité 1, étant donné que le statut de brouillon par défaut est enregistré à la priorité 0.
Pour éviter de répéter les paramètres par défaut et prendre en charge les modifications de paramètres possibles à l'avenir, nous pourrions utiliser la fonction get_post_status_object()
à la place:
add_action( 'init', function()
{
$a = get_object_vars( get_post_status_object( 'draft' ) );
$a['show_in_admin_all_list'] = false; // <-- we override this setting
register_post_status( 'draft', $a );
}, 1 );
Le code ci-dessous supprimera les brouillons de la zone d'administration sous All pour le type de publication post
.
L'argument de requête all_posts
avec la valeur 1
est ajouté au lien de menu pour garantir que nous n'appliquons cette modification que si nécessaire (Le lien Tous situé sous les filtres de publication de l'administrateur ( Tous, le mien, publié, collant). , Planifié, Brouillons )) ajoutera ce paramètre de requête pour nous, mais ce n’est pas le cas lorsque vous cliquez sur le menu Administrateur. Nous devons donc l’ajouter nous-mêmes.
Placez le code ci-dessous dans le functions.php
de votre thème ou dans un plugin.
// Add a query argument to the Posts admin menu.
// This is used to ensure that we only apply our special filtering when needed.
add_action( 'admin_menu', 'wpse255311_admin_menu', PHP_INT_MAX );
function wpse255311_admin_menu() {
global $menu, $submenu;
$parent = 'edit.php';
foreach( $submenu[ $parent ] as $key => $value ){
if ( $value['2'] === 'edit.php' ) {
$submenu[ $parent ][ $key ]['2'] = 'edit.php?all_posts=1';
break;
}
}
}
// Hide draft posts from All listing in admin.
add_filter( 'pre_get_posts', 'wpse255311_pre_get_posts' );
function wpse255311_pre_get_posts( $wp_query ) {
$screen = get_current_screen();
// Ensure the the all_posts argument is set and == to 1
if ( ! isset( $_GET['all_posts'] ) || $_GET['all_posts'] != 1 ) {
return;
}
// Bail if we're not on the edit-post screen.
if ( 'edit-post' !== $screen->id ) {
return;
}
// Bail if we're not in the admin area.
if ( ! is_admin() ) {
return;
}
// Ensure we're dealing with the main query and the 'post' post type
// Only include certain post statuses.
if ( $wp_query->is_main_query() && $wp_query->query['post_type'] === 'post' ) {
$wp_query->query_vars['post_status'] = array (
'publish',
'private',
'future'
);
}
}