Czy usunąć możliwość przeglądania administratora na liście użytkowników przez innych użytkowników?

15

( Uwaga moderatora: oryginalny tytuł brzmiał „Usuń administratora z menu użytkownika”)

Utworzyłem rolę administratora klienta, która jest zasadniczo edytorem z możliwością dodawania / usuwania użytkowników. Artykuł Edytor może utworzyć dowolnego nowego użytkownika oprócz administratora doskonale pomógł powstrzymać moją rolę administratora mojego nowego klienta przed edytowaniem lub tworzeniem prawdziwego użytkownika administratora.

Idealne byłoby jednak ukrycie administratorów przed administratorami klientów podczas przeglądania użytkowników. Chcę, aby „uwierzyli” , że są administratorami swojej witryny, ale nie chcę, aby mogli nawet zobaczyć moją rolę / użytkownika - zasadniczo ukrywając przed nimi rolę „administratora”, gdy są w „Użytkownikach” płyta.

Carlos
źródło

Odpowiedzi:

10

Cześć @Carlos:

Spróbuj dodać następujące elementy do functions.phppliku motywu lub w .phppliku we wtyczce, którą możesz pisać (co działa w 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);
  }
}

Jeśli masz WordPress 3.0.x, spróbuj tego (ponieważ WordPress nie dodał 'pre_user_query'haka do 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
źródło
1
Ukrywa to tylko pierwszego dodanego użytkownika (który prawie zawsze jest administratorem) ... ale jeśli administrator ma identyfikator inny niż 1, musisz odpowiednio zmienić zapytanie. Ukryje również tylko 1 administratora, a nie wszystkich administratorów.
EAMann
Właściwie to mogłem tylko uruchomić to w wersji 3.1. Ten sam kod w starszych wersjach wydaje się nie załatwić sprawy (nawet 3.04).
Carlos
@EAMann - Prawda, było mi wygodnie. Jeśli ktoś potrzebuje więcej, zajrzę do tego.
MikeSchinkel
@Carlos - Czy potrzebujesz wersji 3.0.x, czy wszystko w porządku, wersja 3.1?
MikeSchinkel
@ Mike - wow, tak, jeśli byłbyś gotów mi pomóc, byłoby cudownie. Hackowałem się bezskutecznie. Do moich celów identyfikator administratora 1 działa dobrze. Bardzo to doceniam.
Carlos
10

Oto modyfikacja odpowiedzi MikeSchinkela, która sprawdza, czy bieżący użytkownik ma rolę administratora, a jeśli nie, wybiera tylko użytkowników, którzy są subskrybentami.

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
źródło
1
Tylko do wiadomości Dla każdego, kto w przyszłości nie jest zbyt biegły w SQL, taki jak ja, jeśli chcesz pokazać wszystkim użytkownikom, którzy nie są administratorami (redaktorzy, autorzy, subskrybenci itp.), Ale nadal ukrywają administratorów, możesz zmienić tę linię: AND {$wpdb->usermeta}.meta_value = 0i zamiast tego ustaw meta wartość na <10: tak, AND {$wpdb->usermeta}.meta_value < 10)że pokaże wszystkich użytkowników i ukryje wszystkich administratorów przed wszystkimi użytkownikami, bez względu na ich poziom.
Howdy_McGee
2

Poziomy użytkowników są przestarzałe , więc ta metoda sprawdza w zamian możliwości:

/** 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
źródło
1

pre_user_queryakcja może być użyta do zmiany zapytania użytkownika od WordPress 3.1.0

Panna
źródło
1
wp_user_querynie działa jednak w wersji 3.6.1 pre_user_query. nie wiem o 3.5.x
gwillie
1
Czy jesteś pewien? Czy możesz podać źródło? Ta akcja jest używana w bieżącym łączu - patrz wp-include / user.php, wiersz 549 .
Johannes Pille,