我应该使用什么钩子来编辑管理中的POST STATUS选项?

时间:2016-03-07 作者:SinisterBeard

我想将挂起的帖子仅限于管理部分的某些用户,因此我想在查看所有帖子时将其从帖子状态选项中删除(下图中以红色突出显示的位):

WordPress post statuses submenu

然而,我找不到我需要编辑这个的钩子。谁能把我引向正确的方向?我扫描了筛选器引用,但没有看到任何适当的内容。

2 个回复
SO网友:cybmeta

您可以使用过滤器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;
}
此外,如果排除挂起的视图,则需要更新“全部”post计数:

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 );
    }

}

SO网友:Adam

您要查找的筛选器是views_{$this->screen->id} 位于WP_List_Table::views() 方法

哪里$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);

相关推荐

使用wp_ins_post()插入新帖子后,该帖子对wp_Query不可见,但同样的WP_Query也适用于从wp-admin面板插入的帖子

制作脚本,在特定条件下向数据库添加新的自定义帖子。一切正常。但有一种流动。在用我的脚本将帖子写入数据库后,我无法用WP\\u查询将其提取出来。如果我直接从wp管理面板添加帖子,所有WOKR都可以。但如果我用脚本添加帖子,我无法用WP\\u查询提取它们。新添加的帖子显示在wp admin面板的帖子列表中,包含所有所需的值,这些都很酷,但对wp\\U查询不可见。只有在我在wp管理面板中更改帖子的任何自定义字段并按下更新按钮后,它才可见。参考页面后,一切都开始完美工作。新帖子似乎已经发布,当我列出所有此类可用帖