Restringir las capacidades de administración en MultiSite

4
    update_core
    update_plugins
    update_themes
    install_plugins
    install_themes
    delete_themes
    edit_plugins
    edit_themes

Hola, quiero restringir esas capacidades a user_id = 1 para que otros súper administradores no puedan editar archivos de red. (Por cierto, si me falta algo, házmelo saber). ¿Cuál es la forma correcta de esto? Intenté enlace pero agrega un límite de 'manage_esa_options' a cada blog, así que los super_admins ven toneladas de blogs en su administrador. bar ..

    
pregunta Ünsal Korkmaz 19.06.2012 - 13:44

1 respuesta

7

Editar las capacidades de superadministradores es un poco diferente de editar las capacidades de cualquier otra función, porque hay un pequeño desvío en la forma en que WP verifica las capacidades del usuario actual. Esto es lo que encuentra en capabilities.php en la línea 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;
    }

Esto significa que tenemos que agregar explícitamente 'do_not_allow' a la matriz que contiene la capacidad que queremos bloquear. En efecto:

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

He probado esto y parece bloquear a los superadministradores adicionales para que no hagan las cosas que quieres evitar, y lo hace de manera bastante silenciosa (es decir, los redirige al panel de la red).

Para el registro, mi respuesta anterior, funcionaría para la mayoría de los casos excepto la que estaba solicitando. Mis disculpas :)

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

Lea otras preguntas en las etiquetas