Rimuovere la possibilità per gli altri utenti di visualizzare l'amministratore nell'elenco utenti?


15

( Nota del moderatore: il titolo originale era "Rimuovi amministratore dal menu utente")

Ho creato un ruolo di amministratore client che è essenzialmente un editor con la possibilità di aggiungere / rimuovere utenti. L'articolo "L' editor può creare qualsiasi nuovo utente tranne l'amministratore " è stato eccellente per aiutare a impedire al mio nuovo ruolo di amministratore client di modificare o creare un utente amministratore vero.

Tuttavia, l'ideale sarebbe nascondere gli amministratori agli amministratori dei client quando visualizzano gli utenti. Voglio che "credano" che sono gli amministratori del loro sito, ma non voglio che siano anche in grado di visualizzare il mio ruolo / utente - essenzialmente nascondendo loro il ruolo di "amministratore" quando si trovano in "Utenti" pannello.

Risposte:


10

Ciao @Carlos:

Prova ad aggiungere quanto segue al functions.phpfile del tuo tema o in un .phpfile all'interno di un plug-in che potresti scrivere (che funziona per 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);
  }
}

Se hai WordPress 3.0.x prova questo (poiché WordPress non ha aggiunto l' 'pre_user_query'hook fino alla 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);
  }
}

1
Ciò nasconde solo il primo utente aggiunto (che è quasi sempre l'amministratore) ... ma se l'amministratore ha un ID diverso da 1, dovrai modificare la query in modo appropriato. Nasconderà anche solo 1 amministratore, non tutti gli amministratori.
EAMann,

Potrei davvero farlo funzionare solo con la versione 3.1. Lo stesso codice su tutte le versioni precedenti non sembra fare il trucco (anche 3.04).
Carlos,

@EAMann - Vero, stavo facendo comodo. Se qualcuno ha bisogno di più lo esaminerò.
MikeSchinkel,

@Carlos - Hai bisogno di v3.0.x o v3.1 va bene?
MikeSchinkel,

@ Mike — wow, sì, se saresti disposto ad aiutarmi, sarebbe meraviglioso. Ho hackerato senza successo. Per i miei scopi, l'ID amministratore 1 funziona perfettamente. Lo apprezzo molto.
Carlos

10

Ecco una mod alla risposta di MikeSchinkel che controlla se l'utente corrente ha un ruolo di amministratore e, in caso contrario, seleziona solo gli utenti che sono abbonati.

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
        );

    }
}

1
Cordiali saluti Per chiunque in futuro non sia molto competente in SQL come me, se si desidera mostrare a tutti gli utenti che non sono amministratori (redattori, autori, abbonati ecc.) Ma che nascondono comunque amministratori, è possibile modificare questa riga: AND {$wpdb->usermeta}.meta_value = 0e crea invece il meta valore <10 in questo modo: AND {$wpdb->usermeta}.meta_value < 10)che mostrerà tutti gli utenti e nasconderà tutti gli amministratori da tutti gli utenti, indipendentemente dal loro livello.
Howdy_McGee

2

I livelli utente sono obsoleti , quindi questo metodo verifica invece le funzionalità:

/** 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' );

1

pre_user_queryl'azione può essere utilizzata per modificare la query dell'utente da WordPress 3.1.0


1
wp_user_querynon funziona in 3.6.1, tuttavia pre_user_queryfunziona. non so circa 3.5.x
gwillie

1
Sei sicuro? Puoi citare una fonte? Questa azione è usata nel trunk corrente - vedi wp-Includes / user.php, linea 549 .
Johannes Pille,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.