it-swarm.com.de

Beschränken Sie die Verwaltungsfunktionen in MultiSite

    update_core
    update_plugins
    update_themes
    install_plugins
    install_themes
    delete_themes
    edit_plugins
    edit_themes

Hallo, ich möchte diese Funktionen auf user_id = 1 beschränken, damit andere Superadministratoren die Netzwerkdateien nicht bearbeiten können. (Übrigens, wenn ich etwas vermisse, lass es mich wissen). Was ist der richtige Weg dafür? Versucht http://wordpress.org/extend/plugins/extended-super-admins/ aber es fügt jedem Blog eine Obergrenze für 'manage_esa_options' hinzu, sodass super_admins Unmengen von Blogs in ihrer Admin-Leiste sehen.

4
Ünsal Korkmaz

Das Bearbeiten der Superadministrationsfunktionen unterscheidet sich geringfügig vom Bearbeiten der Funktionen aller anderen Rollen, da die Art und Weise, wie WP die Funktionen des aktuellen Benutzers überprüft, geringfügig umgangen wird. Das finden Sie auf capabilities.php in Zeile 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;
    }

Dies bedeutet, dass wir dem Array, das die zu blockierende Funktion enthält, explizit 'do_not_allow' hinzufügen müssen. Im Endeffekt:

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

Ich habe dies getestet und es scheint zu verhindern, dass zusätzliche Superadministratoren die Dinge tun, die Sie verhindern möchten, und dies geschieht im Hintergrund (d. H. Leitet sie an das Netzwerk-Dashboard weiter).

Fürs Protokoll: Meine vorherige Antwort würde in den meisten Fällen funktionieren außer der, nach der Sie gefragt haben. Entschuldigen Sie :)

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