Restringir os recursos de administração no MultiSite

4
    update_core
    update_plugins
    update_themes
    install_plugins
    install_themes
    delete_themes
    edit_plugins
    edit_themes

Oi, quero restringir esses recursos ao user_id = 1 para que outros superadministradores não possam editar arquivos de rede. (Btw se eu estou faltando alguma coisa, me avise). Qual é o modo correto disso? Tentei enlace mas ele adiciona o 'manage_esa_options' em todos os blogs para que os super_admins vejam toneladas de blogs em seus administradores bar ..

    
por Ünsal Korkmaz 19.06.2012 / 13:44

1 resposta

7

A edição de recursos de superadministrador é um pouco diferente de editar os recursos de todas as outras funções, porque há um pequeno desvio na maneira como o WP verifica os recursos do usuário atual. Isto é o que você encontra em capabilities.php na linha 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;
    }

Isso significa que temos que adicionar explicitamente 'do_not_allow' ao array que contém a capacidade que queremos bloquear. Com efeito:

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

Eu testei isso e parece impedir que superadministradores adicionais façam as coisas que você deseja evitar, e isso é feito de forma bastante silenciosa (isto é, redireciona-os para o painel de controle da rede).

Para o registro, minha resposta anterior funcionaria para a maioria dos casos exceto aquele que você estava pedindo. Minhas desculpas:)

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);
            }           
        }
    }
}
    
por Tomas Buteler 21.06.2012 / 15:51