Supprimer la possibilité pour les autres utilisateurs d'afficher l'administrateur dans la liste des utilisateurs?

15

( Note du modérateur: le titre d'origine était "Supprimer l'administrateur du menu utilisateur")

J'ai créé un rôle d'administrateur client qui est essentiellement un éditeur avec la possibilité d'ajouter / supprimer des utilisateurs. L'article «L' éditeur peut créer n'importe quel nouvel utilisateur sauf administrateur » a été excellent pour aider mon nouveau rôle d'administrateur client à ne pas modifier ou créer un véritable utilisateur administrateur.

Cependant, l'idéal serait de cacher les administrateurs aux administrateurs clients lorsqu'ils consultent les utilisateurs. Je veux qu'ils "croient" qu'ils sont l'administrateur de leur site, mais je ne veux pas qu'ils puissent même voir mon rôle / utilisateur - leur cachant essentiellement le rôle "administrateur" lorsqu'ils sont dans les "Utilisateurs" panneau.

Carlos
la source

Réponses:

10

Salut @Carlos:

Essayez d'ajouter ce qui suit au functions.phpfichier de votre thème ou dans un .phpfichier d'un plugin que vous pourriez écrire (qui fonctionne pour WordPress 3.1.x):

add_action('pre_user_query','yoursite_pre_user_query');
function yoursite_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);
  }
}

Si vous avez WordPress 3.0.x, essayez plutôt cela (puisque WordPress n'a pas ajouté le 'pre_user_query'hook avant 3.1):

add_action('pre_user_search','yoursite_pre_user_search');
function yoursite_pre_user_search($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);
  }
}
MikeSchinkel
la source
1
Cela ne fait que masquer le premier utilisateur ajouté (qui est presque toujours l'administrateur) ... mais si l'administrateur a un ID autre que 1, vous devrez modifier la requête de manière appropriée. Il ne masquera également qu'un administrateur, pas tous les administrateurs.
EAMann
Je ne pouvais en fait que faire fonctionner cela sur la version 3.1. Le même code sur les anciennes versions ne semble pas faire l'affaire (3.04 même).
Carlos
@EAMann - C'est vrai, j'étais pratique. Si quelqu'un a besoin de plus, je vais m'en occuper.
MikeSchinkel
@Carlos - Avez-vous besoin de la v3.0.x, ou la v3.1 est-elle correcte?
MikeSchinkel
@ Mike — wow, oui, si vous voulez bien m'aider, ce serait merveilleux. J'ai piraté en vain. Pour mes besoins, l'Admin ID 1 fonctionne très bien. J'apprécie vraiment cela.
Carlos
10

Voici un mod à la réponse de MikeSchinkel qui vérifie si l'utilisateur actuel a un rôle d'administrateur et sinon il ne sélectionne que les utilisateurs qui sont abonnés.

add_action('pre_user_query','yoursite_pre_user_query');
function yoursite_pre_user_query($user_search) {
    $user = wp_get_current_user();

    if ( $user->roles[0] != 'administrator' ) { 
        global $wpdb;

        $user_search->query_where = 
        str_replace('WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
                 SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                    WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}user_level' 
                    AND {$wpdb->usermeta}.meta_value = 0)", 
            $user_search->query_where
        );

    }
}
patnz
la source
1
Juste pour info Pour toute personne future qui n'est pas très compétente en SQL comme moi, si vous voulez montrer tous les utilisateurs qui ne sont pas administrateurs (éditeurs, auteurs, abonnés, etc.) mais toujours masquer les administrateurs, vous pouvez changer cette ligne: AND {$wpdb->usermeta}.meta_value = 0et à la place, faites la méta valeur <10 comme ceci: AND {$wpdb->usermeta}.meta_value < 10)qui montrera tous les utilisateurs et masquera tous les administrateurs de tous les utilisateurs quel que soit leur niveau.
Howdy_McGee
2

Les niveaux d'utilisateur sont obsolètes , donc cette méthode vérifie les capacités à la place:

/** Hide Administrator From User List **/
function isa_pre_user_query( $user_search ) {
    if ( !current_user_can( 'administrator' ) ) { // Is Not Administrator - Remove Administrator
        global $wpdb;

        $user_search->query_where = str_replace(
            'WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
              SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
              WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
              AND {$wpdb->usermeta}.meta_value NOT LIKE '%administrator%' )", 
            $user_search->query_where
        );
    }
}

add_action( 'pre_user_query', 'isa_pre_user_query' );
Howdy_McGee
la source
1

pre_user_queryl'action peut être utilisée pour modifier la requête de l'utilisateur depuis WordPress 3.1.0

Vierge
la source
1
wp_user_queryne fonctionne pas dans 3.6.1, cependant pre_user_query. Je ne sais pas pour 3.5.x
gwillie
1
Êtes-vous sûr? Pouvez-vous citer une source? Cette action est utilisée dans le tronc actuel - voir wp-includes / user.php, ligne 549 .
Johannes Pille