限制多站点中的管理员功能

时间:2012-06-19 作者:Ünsal Korkmaz

    update_core
    update_plugins
    update_themes
    install_plugins
    install_themes
    delete_themes
    edit_plugins
    edit_themes
您好,我想将这些功能限制为user\\u id=1,以便其他超级管理员无法编辑网络文件。(顺便说一句,如果我遗漏了什么,请告诉我)。什么是正确的方法?尝试http://wordpress.org/extend/plugins/extended-super-admins/ 但它在每个博客上都添加了“manage\\u esa\\u options”的上限,因此超级管理员可以在他们的管理栏中看到大量的博客。。

1 个回复
最合适的回答,由SO网友:Tomas Buteler 整理而成

编辑超级管理员功能与编辑其他所有角色的功能略有不同,因为WP检查当前用户功能的方式有点迂回。这就是你在capabilities.php 第864行:

function has_cap( $cap ) {

    // (...)

    // Multisite super admin has all caps by definition, Unless specifically denied.
    if ( is_multisite() && is_super_admin( $this->ID ) ) {
        if ( in_array(\'do_not_allow\', $caps) )
            return false;
        return true;
    }
这意味着我们必须将“do\\u not\\u allow”显式添加到包含要阻止的功能的数组中。实际上:

add_filter(\'map_meta_cap\', \'not_so_super_admins\', 10, 4);
function not_so_super_admins($caps, $cap, $user_id, $args){

    $super = array(
        \'update_core\',
        \'update_plugins\',
        \'update_themes\',
        \'install_plugins\',
        \'install_themes\',
        \'delete_themes\',
        \'edit_plugins\',
        \'edit_themes\'
    );

    if($user_id != 1 && in_array($cap, $super)) {
        $caps[] = \'do_not_allow\';
    }

    return $caps;
}
我已经对此进行了测试,它似乎阻止了其他超级管理员执行您想要阻止的操作,并且它会以相当安静的方式执行(即将他们重定向到网络仪表板)。

我之前的回答对大多数情况都适用except 你要的那个。抱歉:)

add_action(\'init\', \'not_so_super_admins\');
function not_so_super_admins() {
    if(is_multisite() && $GLOBALS[\'blog_id\'] == 1) {
        $role = get_role(\'administrator\');
        $super = array(
           \'update_core\',
           \'update_plugins\',
           \'update_themes\',
           \'install_plugins\',
           \'install_themes\',
           \'delete_themes\',
           \'edit_plugins\',
           \'edit_themes\'
        );          
        if(get_current_user_id() != 1) {   
            foreach($super as $cap) {
                $role->remove_cap($cap);
            }
        }
        else {
            foreach($super as $cap) {
                $role->add_cap($cap);
            }           
        }
    }
}