保留中の投稿を管理者セクションの特定のユーザーのみに制限したいので、すべての投稿を表示するときに投稿ステータスオプションから削除したいと思います(下の画像で赤で強調表示されている部分)。
しかし、これを編集するために必要なフックが見つかりません。誰かが私を正しい方向に転向させることができますか?フィルターの参照をスキャンしましたが、適切なものが見つかりませんでした。
利用可能な "ビュー"を変更するためにフィルタviews_edit-post
(またはviews_edit-{custom-post-type}
)を使うことができます。
add_filter('views_edit-post', 'cyb_remove_pending_filter' );
function cyb_remove_pending_filter( $views ) {
if( isset( $views['pending'] ) ) {
unset( $views['pending'] );
}
return $views;
}
上記のフィルタには、適用したいユーザルールを含める必要があります。たとえば、他の投稿を編集できないユーザーに対してのみ[保留中]ビューを削除する場合は、次のようにします。
add_filter('views_edit-post', 'cyb_remove_pending_filter' );
function cyb_remove_pending_filter( $views ) {
if( isset( $views['pending'] ) && ! current_user_can('edit_others_posts') ) {
unset( $views['pending'] );
}
return $views;
}
また、保留中のビューを除外した場合は、 "All"投稿数を更新する必要があります。
add_filter('views_edit-post', 'cyb_remove_pending_filter' );
function cyb_remove_pending_filter( $views ) {
if( isset( $views['pending'] ) && ! current_user_can('edit_others_posts') ) {
unset( $views['pending'] );
$args = [
// Post params here
// Include only the desired post statues for "All"
'post_status' => [ 'publish', 'draft', 'future', 'trash' ],
'all_posts' => 1,
];
$result = new WP_Query($args);
if($result->found_posts > 0) {
$views['all'] = sprintf(
'<a href="%s">'.__('All').' <span class="count">(%d)</span></a>',
admin_url('edit.php?all_posts=1&post_type='.get_query_var('post_type')),
$result->found_posts
);
}
}
return $views;
}
このコードは画面のフィルタを削除するだけですが、保留中のステータスの投稿へのアクセスをブロックしません。アクセスをブロックするにはpre_get_posts
アクションを使う必要があります。例えば:
add_action( 'pre_get_posts', 'cyb_exclude_pending_posts' );
function cyb_exclude_pending_posts( $query ) {
// only in admin, main query and if user can not edit others posts
if( is_admin() && ! current_user_can('edit_others_posts') && $query->is_main_query() ) {
// Include only the desired post statues
$post_status_arg = [ 'publish', 'draft', 'future', 'trash' ];
$query->set( 'post_status', $post_status_arg );
}
}
あなたが探しているフィルタはWP_List_Table::views()
メソッドにあるviews_{$this->screen->id}
です。
$this->screen->id
はあなたがいるコンテキストのものです、例えばposts
、users
など.
ファイルwp-admin/class-wp-list-table.php
使用例
function filter_posts_listable_views($views) {
//do your thing...
return $views;
}
add_filter( 'views_posts', 'filter_posts_list_table_views', 100);