Deaktivieren Sie die Möglichkeit für andere Benutzer, den Administrator in der Benutzerliste anzuzeigen.

15

( Anmerkung des Moderators: Der ursprüngliche Titel lautete "Admin aus Benutzermenü entfernen")

Ich habe eine Clientadministratorrolle erstellt, bei der es sich im Wesentlichen um einen Editor handelt, der Benutzer hinzufügen / entfernen kann. Der Artikel " Editor kann jeden neuen Benutzer außer Administrator erstellen " hat hervorragend dazu beigetragen, dass meine neue Client-Administratorrolle keinen True-Administrator-Benutzer bearbeitet oder erstellt.

Ideal wäre es jedoch, Administratoren vor Clientadministratoren zu verbergen, wenn diese Benutzer anzeigen. Ich möchte , dass sie zu „glauben“ , dass sie der Admin ihrer Seite sind , aber ich möchte nicht , sie in der Lage sein , auch zu meiner Rolle / Benutzer sehen - im Wesentlichen die versteckt „Administrator“ Rolle von ihnen , wenn sie in den sind „Benutzer“ panel.

Carlos
quelle

Antworten:

10

Hallo @Carlos:

Fügen Sie der functions.phpDatei Ihres Themas oder einer .phpDatei in einem Plugin, das Sie möglicherweise schreiben, Folgendes hinzu (funktioniert für 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);
  }
}

Wenn Sie WordPress 3.0.x haben, versuchen Sie dies stattdessen (da WordPress den 'pre_user_query'Hook erst in 3.1 hinzugefügt hat ):

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
quelle
1
Das verbirgt nur den ersten hinzugefügten Benutzer (der fast immer der Administrator ist) ... aber wenn der Administrator eine andere ID als 1 hat, müssen Sie die Abfrage entsprechend ändern. Außerdem wird nur 1 Administrator ausgeblendet, nicht alle Administratoren.
EAMann
Ich konnte das eigentlich nur auf Version 3.1 zum Laufen bringen. Der gleiche Code auf älteren Versionen scheint nicht den Trick zu machen (3.04 sogar).
Carlos
@ EAMann - Stimmt, ich war praktisch. Wenn jemand mehr braucht, werde ich mich darum kümmern.
MikeSchinkel
@Carlos - Benötigen Sie v3.0.x oder ist v3.1 in Ordnung?
MikeSchinkel
@ Mike - wow, ja, wenn du mir dabei helfen würdest, wäre es wunderbar. Ich habe vergebens gehackt. Für meine Zwecke funktioniert Admin ID 1 einwandfrei. Ich weiß das wirklich zu schätzen.
Carlos
10

Hier ist ein Mod für die Antwort von MikeSchinkel, der prüft, ob der aktuelle Benutzer eine Administratorrolle hat und falls nicht, nur Benutzer auswählt, die Abonnenten sind.

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
quelle
1
Nur zu Ihrer Information Für alle, die in der Zukunft nicht besonders gut mit SQL umgehen können, wie ich, können Sie diese Zeile ändern: AND {$wpdb->usermeta}.meta_value = 0und Stellen Sie stattdessen den Meta-Wert auf <10 ein AND {$wpdb->usermeta}.meta_value < 10), um alle Benutzer anzuzeigen und alle Administratoren für alle Benutzer auszublenden, unabhängig von ihrer Stufe.
Howdy_McGee
2

Benutzerebenen sind veraltet , daher überprüft diese Methode stattdessen die Funktionen:

/** 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
quelle
1

pre_user_queryMit action kann die Benutzerabfrage seit WordPress 3.1.0 geändert werden

Jungfrau
quelle
1
wp_user_queryfunktioniert in 3.6.1 jedoch pre_user_querynicht. Weiß nicht über 3.5.x
gwillie
1
Bist du sicher? Können Sie eine Quelle angeben? Diese Aktion wird im aktuellen Trunk verwendet - siehe wp-includes / user.php, Zeile 549 .
Johannes Pille