web-dev-qa-db-fra.com

Limiter les capacités d'administrateur dans MultiSite

    update_core
    update_plugins
    update_themes
    install_plugins
    install_themes
    delete_themes
    edit_plugins
    edit_themes

Bonjour, je souhaite limiter ces fonctionnalités à user_id = 1 afin que les autres super-administrateurs ne puissent pas modifier les fichiers réseau. (Btw si je manque quelque chose, faites le moi savoir). Quelle est la bonne façon de cela? Essayé http://wordpress.org/extend/plugins/extended-super-admins/ mais il ajoute la casquette 'manage_esa_options' à chaque blog afin que les super_admins voient des tonnes de blogs dans leur barre d'administration.

4
Ünsal Korkmaz

La modification des capacités du super administrateur est légèrement différente de celle des autres rôles, car il y a un léger détour dans la façon dont WP vérifie les capacités de l'utilisateur actuel. Voici ce que vous trouvez sur capabilities.php à la ligne 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;
    }

Cela signifie que nous devons explicitement ajouter 'do_not_allow' au tableau contenant la capacité que nous voulons bloquer. En effet:

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

J'ai testé cela et cela semble empêcher d'autres super-administrateurs de faire ce que vous voulez empêcher, et cela assez silencieusement (c'est-à-dire, les rediriger vers le tableau de bord du réseau).

Pour mémoire, ma réponse précédente fonctionnerait dans la plupart des cas sauf celui que vous demandiez. Mes excuses :)

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);
            }           
        }
    }
}
7
Tomas Buteler