Allビューは、wp-admin/edit.php
内の下書きを含むすべての投稿を表示します。ドラフトステータスの投稿をallビューで除外するにはどうすればよいですか。
register_post_status()
関数のshow_in_admin_all_list
パラメーターは、特定の投稿ステータスが All postテーブルビューに含まれるかどうかを決定します。
おそらく最短のバージョンは次のとおりです。
add_action( 'init', function() use ( &$wp_post_statuses )
{
$wp_post_statuses['draft']->show_in_admin_all_list = false;
}, 1 );
しかし、このようにグローバルを直接変更することを避け、デフォルトのdraft
ステータスを次のように上書きします。
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 );
デフォルトのドラフトステータスは優先度0で登録されているので、優先度1を使用します。
デフォルト設定の繰り返しを避け、将来可能な設定変更をサポートするために、代わりにget_post_status_object()
を使うことができます。
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 );
以下のコードは、_ post
投稿タイプの All リストの下の管理領域からドラフト投稿を削除します。
all_posts
の値を持つクエリ引数1
がメニューリンクに追加され、必要な場合にのみこの変更を適用するようにしています(管理ポストフィルタの下の All リンク( All、Mine、 Published、Sticky、Scheduled、Drafts ))はこのクエリパラメータを追加しますが、管理者メニューをクリックした場合はそうではないので、自分で追加する必要があります。
以下のコードをあなたのテーマのfunctions.php
またはプラグイン内に配置してください。
// 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'
);
}
}