web-dev-qa-db-ja.com

Adminの投稿ステータスオプションを編集するためにどのようなフックを使用しますか?

保留中の投稿を管理者セクションの特定のユーザーのみに制限したいので、すべての投稿を表示するときに投稿ステータスオプションから削除したいと思います(下の画像で赤で強調表示されている部分)。

WordPress post statuses submenu 

しかし、これを編集するために必要なフックが見つかりません。誰かが私を正しい方向に転向させることができますか?フィルターの参照をスキャンしましたが、適切なものが見つかりませんでした。

5
SinisterBeard

利用可能な "ビュー"を変更するためにフィルタ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 );
    }

}
3
cybmeta

あなたが探しているフィルタはWP_List_Table::views()メソッドにあるviews_{$this->screen->id}です。

$this->screen->idはあなたがいるコンテキストのものです、例えばpostsusersなど.

ファイル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);
1
userabuser