web-dev-qa-db-fra.com

Comment permettre à un administrateur de site de modifier des utilisateurs dans une configuration réseau/multisite WordPress?

J'ai quelques sites dans un réseau. Je ne veux pas que les administrateurs de site gèrent des tâches telles que les plug-ins de réseau, mais j'aimerais qu'ils puissent modifier les profils de tous les utilisateurs du réseau et non les utiliser sur leur site.

En haut du fichier /wp-admin/network/users.php se trouve ceci:

 if (! current_user_can ('manage_network_users')) 
 wp_die (__ ('Vous n'avez pas le droit d'accéder à cette page.')); 

Comment octroyer des privilèges aux administrateurs de site sur manage_network_users sans les promouvoir en tant que Super Admin?

Voici à quoi ressemble le code:

 
/** 
 * Récupérer une liste de super-administrateurs. 
 * 
 * @À partir de la 3.0.0.0 
 * 
 * @uses $ super_admins Variable globale des super-administrateurs, si définie. 
 * 
 * @return array Liste des connexions super-admin 
 */
 get_super_admins () {
 global $ super_admins; 
 
 if (isset ($ super_admins)) 
 renvoyer $ super_admins; 
 sinon 
 return get_site_option ('administrateurs_site', array ('admin')); 
} 
 
/** 
 * Déterminer si l'utilisateur est un administrateur du site. 
 * 
 * À partir de la 3.0.0.0 
 * 
 * @param int $ user_id (Facultatif) ID d'un utilisateur. La valeur par défaut est l'utilisateur actuel. 
 * @Return bool True si l'utilisateur est un administrateur de site. 
 */
 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)) 
 renvoie false; 
 
 if (is_multisite ()) {
 $ super_admins = get_super_admins (); 
 if (is_array ($ super_admins) && in_array ($ user-> user_login, $ super_admins)) 
 renvoie true; 
} sinon {
 if ($ user-> has_cap ( 'delete_users')) 
 renvoie vrai; 
} 
 
 renvoie faux; 
} 
 
 /**
 * Indique si l'utilisateur a une capacité ou un nom de rôle. 
 * 
 * Ceci est utile pour déterminer si l'utilisateur a un rôle spécifique 
 * attribué à l'utilisateur. Le deuxième paramètre facultatif peut également être utilisé pour 
 * Vérifier les capacités par rapport à un article spécifique. 
 * 
 * @Depuis 2.0.0 
 * @Access public 
 * 
 * @param string | int $ cap Nom de capacité ou de rôle à rechercher. 
 * @param int $ post_id Facultatif. ID de poste pour vérifier la capacité par rapport à une poste spécifique. 
 * @Return bool True, si l'utilisateur en a la capacité; false, si l'utilisateur n'a pas la capacité. 
 */
 function has_cap ($ cap) {
 # fb ($ cap); 
 if (is_numeric ($ cap)) {
 _deprecated_argument (__FUNCTION__, '2.0', __ ('L'utilisation des niveaux d'utilisateur par les plugins et les thèmes est obsolète. Utilisez plutôt les rôles et les fonctionnalités.')); 
 $ 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); 
 
 // Le super administrateur multisite a toutes les majuscules par définition, sauf si spécifiquement refusé. 
 if (is_multisite () && is_super_admin ($ this-> ID)) {
 if (in_array ('do_not_allow', $ caps)) 
 return false; 
 return true; 
} 
 
 // Doit avoir TOUS les capuchons demandés 
 $ capacites = apply_filters ('user_has_cap', $ this-> allcaps, $ caps, $ args); 
 $ capacites ['exist'] = true; // Tout le monde est autorisé à exister 
 Foreach ((array) $ caps as $ cap) {
 // echo "Checking cap $ cap
"; if (vide ($ Capacités [$ cap]) ||! $ Capacités [$ cap]) Renvoie false; } retourne vrai; }

Code provenant du fichier users.php dans wp-admin affichant un deuxième contrôle de capacité pour l'édition d'utilisateurs du réseau:

 // Autorise uniquement les super-administrateurs de sites multiples à modifier chaque utilisateur. 
 If (is_multisite () &&! Current_user_can ('manage_network_users') && $ user_id! = $ Current_user-> ID &&! Apply_filters ( 'enable_edit_any_user_configuration', true)) 
 wp_die (__ ('Vous n'êtes pas autorisé à modifier cet utilisateur.')); 
 
2
cwd

Voici une solution qui a fonctionné pour moi:

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

Assez élégant et n'implique pas de jouer avec le noyau.

6
Michael

Malheureusement, je n'ai pas assez de points pour ajouter un commentaire ou voter jusqu'à la réponse de @Michael ci-dessus, mais je voulais signaler un autre message qui offre une solution plus agréable au problème de l'arrêt des non-administrateurs. les utilisateurs de l'édition de comptes admin/super-admin.

La solution dans le post lien donné par Michael fonctionne bien , je viens de l'appliquer à un WP multi-site v4.1. Cependant, il appelle la fonction die() lorsqu'un utilisateur non-administrateur tente de modifier un compte administrateur. Au lieu de cela, j’ai donc utilisé cette solution (qui s’applique initialement pour une installation de WP sur un seul site) qui masque tous les comptes d’utilisateur administrateur de la liste des utilisateurs lorsqu’un utilisateur non administrateur y accède.

La solution finale, une combinaison des deux précédents, donne cette ...

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