根据用户角色删除管理菜单项的插件?

时间:2011-01-30 作者:Wyck

我到处搜索一个插件,它可以根据用户角色删除/隐藏管理菜单项,包括自定义帖子类型和分类法。

我尝试过的每一个都只进行全局隐藏,而不是基于用户角色。其他更复杂的功能,如adminize,不显示自定义的帖子类型或分类法。

我是否必须编写自己的函数,或者是否有一个我忽略的简单插件?

4 个回复
最合适的回答,由SO网友:Bainternet 整理而成

更新:

再次阅读mike的答案让我想到,您可以为角色添加新功能,并在删除条件时使用该功能,因此:

   // first add your role the capability like so
   // get the "author" role object
   $role = get_role( \'administrator\' );

   // add "see_all_menus" to this role object
   $role->add_cap( \'see_all_menus\' );

   //then remove menu items based on that
   function remove_those_menu_items( $menu_order ){
            global $menu;
            // check using the new capability with current_user_can
            if ( !current_user_can( \'see_all_menus\' ) ) {
             foreach ( $menu as $mkey => $m ) {
                //custom post type name "portfolio"
                $key = array_search( \'edit.php?post_type=portfolio\', $m );
                //pages menu
                $keyB = array_search( \'edit.php?post_type=page\', $m );
                //posts menu
                $keyC = array_search( \'edit.php\', $m );

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

 //Then just Hook that function to "menu_order"
        add_filter( \'menu_order\', \'remove_those_menu_items\' );
旧答案

我完全同意mike发布的内容,但如果您不符合自定义编码,请查看Admin Menu Editor 插件。

它允许您按级别设置访问权限。

SO网友:Anh Tran

有一个插件专门为这个问题创建:Hide Admin Menu. 此插件可以:

根据用户角色隐藏管理菜单项,包括管理员和自定义用户角色,也可以隐藏管理栏项,还可以导出/导入设置以在其他网站上使用该插件的另一个优点是它直观且易于使用。

SO网友:MikeSchinkel

你好@Wyck:

我绝对能理解你的需要;我也有客户提出同样的要求。不幸的是,WordPress将管理菜单页(即菜单部分)与菜单子页(即菜单项)联系在一起to capabilities, not to roles.

然而,编写一些插件代码来允许您将管理菜单选项分配给角色并不难;脚本会将所有菜单选项所需的功能设置为需要新的\'not-allowed\' 然后让您的代码有选择地指定默认值\'read\' 当前用户角色具有定义功能的每个菜单选项的功能。

更大的问题是如何表示用户角色到菜单选项的映射?我可以看出,这需要一个非常复杂的管理用户界面。当然,如果您只想硬编码一个数组来定义哪些角色可以看到什么,那么这将非常简单。。。

SO网友:tivnet

这将只为非管理员保留几个菜单项@Bainternet的版本使用add_cap, 这只能在主题或插件激活时执行一次。

add_action(\'admin_menu\', function () {
    if (current_user_can(\'administrator\')) {
        return;
    }

    /**
     * Keep only specific menu items and remove all others
     */
    global $menu;
    $hMenu = $menu;
    foreach ($hMenu as $nMenuIndex => $hMenuItem) {
        if (in_array($hMenuItem[2], array(
                                         \'index.php\',
                                         \'edit.php?post_type=product\',
                                    ))
        ) {
            continue;
        }
        unset($menu[$nMenuIndex]);
    }
}

结束