it-swarm.com.de

Wie kann ein Site-Administrator Benutzer in einem WordPress-Netzwerk/Multisite-Setup bearbeiten?

Ich habe einige Standorte in einem Netzwerk. Ich möchte nicht, dass die Site-Administratoren Dinge wie Netzwerk-Plugins verwalten, aber ich möchte, dass sie Profile aller Netzwerkbenutzer bearbeiten können, ohne diese auf ihrer Site zu verwenden.

Oben in der /wp-admin/network/users.php-Datei steht:

 if (! current_user_can ('manage_network_users')) 
 wp_die (__ ('Sie haben keine Berechtigung, auf diese Seite zuzugreifen.')); 

Wie kann ich Site-Administratoren Berechtigungen für manage_network_users gewähren, ohne sie zu Super Admin zu befördern?

So sieht der Code aus:

 
/** 
 * Eine Liste der Superadministratoren abrufen. 
 * 
 * @Ab 3.0.0 
 * 
 * @uses $ super_admins Globale Variable "Super Admins", falls gesetzt. 
 * 
 * @return array Liste der Super-Admin-Anmeldungen 
 */
 get_super_admins () {
 global $ super_admins; 
 
 if (isset ($ super_admins)) 
 return $ super_admins; 
 else 
 return get_site_option ('site_admins', array ('admin')); 
} 
 
/** 
 * Bestimmen Sie, ob der Benutzer ein Site-Administrator ist. 
 * 
 * @Ab 3.0.0 
 * 
 * @param int $ user_id (Optional) Die ID eines Benutzers. Der Standardwert ist der aktuelle Benutzer. 
 * @Return bool True, wenn der Benutzer ein Site-Administrator ist. 
 */
 Function is_super_admin ($ user_id = false) {
 if ($ user_id) 
 $ user = new WP_User ($ user_id); 
 else 
 $ user = wp_get_current_user (); 
 
 if ( empty ($ user-> id)) 
 return false; 
 
 if (is_multisite ()) {
 $ super_admins = get_super_admins (); 
 if (is_array ($ super_admins) && in_array ($ user-> user_login, $ super_admins)) 
 return true; 
} else {
 if ($ user-> has_cap ( 'delete_users')) 
 return true; 
} 
 
 return false; 
} 
 
 /**
 * Ob der Benutzer über eine Funktion oder einen Rollennamen verfügt. 
 * 
 * Dies ist nützlich, um nachzuschlagen, ob der Benutzer eine bestimmte Rolle hat. 
 * dem Benutzer zugewiesen. Der zweite optionale Parameter kann auch verwendet werden, um 
 * Die Fähigkeiten anhand eines bestimmten Posts zu überprüfen. 
 * 
 * @Since 2.0.0 
 * @Access public 
 * 
 * @param string | int $ cap Suchfunktion oder Rollenname. 
 * @param int $ post_id Optional. Beitrags-ID, um die Fähigkeit mit einem bestimmten Beitrag zu vergleichen. 
 * @Return bool Wahr, wenn der Benutzer die Fähigkeit hat; false, wenn der Benutzer keine Funktion besitzt. 
 */
 has_cap ($ cap) {
 # fb ($ cap); 
 if (is_numeric ($ cap)) {
 _deprecated_argument (__FUNCTION__, '2.0', __ ('Die Verwendung von Benutzerebenen durch Plugins und Themes ist veraltet. Verwenden Sie stattdessen Rollen und Funktionen.')); 
 $ cap = $ this-> translate_level_to_cap ($ cap); 
} 
 
 $ args = array_slice (func_get_args (), 1); 
 $ args = array_merge (array ($ cap, $ this-> ID), $ args); 
 $ caps = call_user_func_array ('map_meta_cap', $ args); 
 
 // Multisite-Superadministrator hat alle Caps von Definition, sofern nicht ausdrücklich verweigert. 
 if (is_multisite () && is_super_admin ($ this-> ID)) {
 if (in_array ('do_not_allow', $ caps)) 
 return false; 
 return true; 
} 
 
 // Muss ALLE angeforderten Caps 
 $ functions = apply_filters ('user_has_cap', $ this-> allcaps, $ caps, $ args); 
 $ functions ['exist'] = true; // Jeder darf 
 Foreach ((array) $ caps als $ cap) {
 // echo "Checking cap $ cap
"; if (leer ($ Cap]) ||! $ Cap]) return false; } return true; }

Code aus users.php in wp-admin mit einer zweiten Funktionsprüfung zum Bearbeiten von Netzwerkbenutzern:

 // Nur Super-Administratoren auf mehreren Sites erlauben, jeden Benutzer zu bearbeiten. 
 If (is_multisite () &&! Current_user_can ('manage_network_users') && $ user_id! = $ Current_user-> ID &&! Apply_filters ( 'enable_edit_any_user_configuration', true)) 
 wp_die (__ ('Sie haben keine Berechtigung, diesen Benutzer zu bearbeiten.')); 
 
2
cwd

Hier ist eine Lösung, die für mich funktioniert hat:

http://thereforei.am/2011/03/15/how-to-allow-administrators-to-edit-users-in-a-wordpress-network/

Ziemlich elegant und es geht nicht darum, mit dem Kern herumzuspielen.

6
Michael

Leider habe ich nicht genug Punkte, um einen Kommentar hinzuzufügen oder die Antwort von @Michael abzustimmen, aber ich wollte auf einen anderen Beitrag hinweisen, der eine bessere Lösung für das Problem bietet, Benutzer ohne Administratorrechte davon abzuhalten Bearbeiten von Admin/Super-Admin-Konten.

Die Lösung im Beitrag Link von Michael funktioniert einwandfrei , ich habe sie gerade auf eine WP Multi-Site v4.1 angewendet. Es ruft jedoch die Funktion die() auf, wenn ein Benutzer ohne Administratorrechte versucht, ein Administratorkonto zu bearbeiten. Also habe ich stattdessen diese Lösung (die ursprünglich für eine Einzelstandortinstallation von WP gedacht war) verwendet, bei der alle Administratorkonten aus der Liste der Benutzer ausgeblendet werden, wenn ein Benutzer ohne Administratorrechte darauf zugreift.

Die endgültige Lösung, eine Kombination der beiden oben genannten, gibt diese ...

function mc_admin_users_caps( $caps, $cap, $user_id, $args ){

    foreach( $caps as $key => $capability ){

        if( $capability != 'do_not_allow' )
            continue;

        switch( $cap ) {
            case 'edit_user':
            case 'edit_users':
                $caps[$key] = 'edit_users';
                break;
            case 'delete_user':
            case 'delete_users':
                $caps[$key] = 'delete_users';
                break;
            case 'create_users':
                $caps[$key] = $cap;
                break;
        }
    }

    return $caps;
}
add_filter( 'map_meta_cap', 'mc_admin_users_caps', 1, 4 );
remove_all_filters( 'enable_edit_any_user_configuration' );
add_filter( 'enable_edit_any_user_configuration', '__return_true');

/*
 * hide admin from user list
 */
add_action('pre_user_query','isa_pre_user_query');
function isa_pre_user_query($user_search) {
  $user = wp_get_current_user();
  if ($user->ID!=1) { // Is not administrator, remove administrator
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}
3
Aurovrata