删除非管理员用户的自定义帖子类型菜单。

时间:2011-01-19 作者:jetDL

我整天都在研究这个问题,还没有得出多少结果。

我想通过用户级别(或其他方式)限制谁可以查看我的自定义帖子类型。因此,如果登录的人不是“管理员”,则添加的自定义帖子类型对他们不可见。

以下是我拥有的自定义帖子类型的一部分:

add_action(\'init\', \'portfolio_register\');

function portfolio_register() {

    $labels = array(
        \'name\' => _x(\'Case Studies\', \'post type general name\'),
        \'singular_name\' => _x(\'Case Study Item\', \'post type singular name\'),
        \'add_new\' => _x(\'Add New\', \'portfolio item\'),
        \'add_new_item\' => __(\'Add New Case Study Item\'),
        \'edit_item\' => __(\'Edit Case Study Item\'),
        \'new_item\' => __(\'New Case Study Item\'),
        \'view_item\' => __(\'View Case Study Item\'),
        \'search_items\' => __(\'Search Case Studies\'),
        \'not_found\' =>  __(\'Nothing found\'),
        \'not_found_in_trash\' => __(\'Nothing found in Trash\'),
        \'parent_item_colon\' => \'\'
    );

    $args = array(
        \'labels\' => $labels,
        \'public\' => true,
        \'publicly_queryable\' => true,
        \'show_ui\' => true,
        \'query_var\' => true,
        /*\'menu_icon\' => get_stylesheet_directory_uri() . \'/article16.png\',*/
        \'rewrite\' => true,
        \'capability_type\' => \'post\',
        \'hierarchical\' => false,
        \'menu_position\' => null,
        \'supports\' => array(\'title\',\'editor\',\'thumbnail\')
      ); 

    register_post_type( \'portfolio\' , $args );
}
以下是我发现的不适用于自定义帖子类型菜单删除的潜在解决方案:

function remove_menus()
{
    global $menu;
    global $current_user;
    get_currentuserinfo();

    if($current_user->user_login != \'admin\')
    {
        $restricted = array(__(\'Posts\'),
                            __(\'Media\'),
                            __(\'Links\'),
                            __(\'Pages\'),
                            __(\'Comments\'),
                            __(\'Appearance\'),
                            __(\'Plugins\'),
                            __(\'Users\'),
                            __(\'Tools\'),
                            __(\'Settings\')
        );
        end ($menu);
        while (prev($menu)){
            $value = explode(\' \',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// end while

    }// end if
}
add_action(\'admin_menu\', \'remove_menus\');
上面的操作可以删除默认菜单项,但我无法让它删除自定义帖子类型菜单。此外,它是特定于用户名的,如果我可以向其中添加多个用户,这也没关系。

global $user_login;
get_currentuserinfo();
   if (!current_user_can(\'update_plugins\')) {
      .......
   }
以上这些根本不起作用。

谢谢

3 个回复
SO网友:t31os

Codex - Register Post Type

请参见capability_typecapabilities 的参数register_post_type.您可以通过capabilities 参数映射到必要CAP的功能数组,下面是具有自定义功能的args数组的示例。

$args = array(
    \'labels\' => $labels,
    \'public\' => true,
    \'publicly_queryable\' => true,
    \'show_ui\' => true,
    \'query_var\' => true,
    \'rewrite\' => true,
    \'capabilities\' => array(
        \'publish_posts\' => \'ADD_CAP_HERE\',
        \'edit_posts\' => \'ADD_CAP_HERE\',
        \'edit_others_posts\' => \'ADD_CAP_HERE\',
        \'delete_posts\' => \'ADD_CAP_HERE\',
        \'delete_others_posts\' => \'ADD_CAP_HERE\',
        \'read_private_posts\' => \'ADD_CAP_HERE\',
        \'edit_post\' => \'ADD_CAP_HERE\',
        \'delete_post\' => \'ADD_CAP_HERE\',
        \'read_post\' => \'ADD_CAP_HERE\',
    ),
    \'hierarchical\' => false,
    \'menu_position\' => null,
    \'supports\' => array(\'title\',\'editor\',\'thumbnail\')
); 
你当然会替换ADD_CAP_HERE 有能力。如果您想将此帖子类型限制为管理员,只需使用管理员拥有的功能,例如manage_options.

角色及其大写字母表(供快速参考)
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

SO网友:jetDL

好的,在做了更多的谷歌搜索之后,我终于找到了答案,并将其与上面的一个脚本相结合,创建了我想要做的事情。以下是我所做的,以防其他人也希望这样做:

global $user_login;
get_currentuserinfo();
if (!current_user_can(\'update_plugins\')) {
    .....
}
以上代码将获得当前用户级别,如果他们有权更新/编辑插件,那么他们可以访问附带的功能。

add_filter( \'custom_menu_order\', \'toggle_custom_menu_order\' );

function remove_those_menu_items( $menu_order ){
    global $menu;

    foreach ( $menu as $mkey => $m ) {
        $key = array_search( \'edit.php?post_type=portfolio\', $m );
        $keyB = array_search( \'edit.php?post_type=bio\', $m );
        $keyC = array_search( \'edit.php?post_type=philo\', $m );

        if ( $key || $keyB || $keyC )
            unset( $menu[$mkey] );
    }

    return $menu_order;
}
add_filter( \'menu_order\', \'remove_those_menu_items\' );
以上内容实际上允许您从管理菜单系统中删除自定义帖子类型。您只需添加相同数量的$key 如你所需。你可以从original here.

SO网友:Bainternet

我不知道代码有什么问题,但每当我需要将菜单项限制为用户时,我都会使用:Admin Menu Editor 一个为你做这件事的插件。

结束

相关推荐