Rimuovere la Possibilità per Altri Utenti di Visualizzare l'Amministratore nell'Elenco Utenti?
(Nota del moderatore: Il titolo originale era "Rimuovi Amministratore dal menu Utenti")
Ho creato un ruolo di amministratore clienti che è essenzialmente un Editor con la possibilità di aggiungere/rimuovere utenti. L'articolo "Editor può creare qualsiasi nuovo utente tranne l'amministratore" è stato eccellente nell'aiutarmi a impedire al mio nuovo ruolo di amministratore clienti di modificare o creare un vero utente amministratore.
Tuttavia, sarebbe ideale nascondere gli amministratori agli amministratori clienti quando visualizzano gli utenti. Voglio che loro "credano" di essere gli amministratori del loro sito, ma non voglio che possano nemmeno visualizzare il mio ruolo/utente - sostanzialmente nascondendo il ruolo "amministratore" da loro quando sono nel pannello "Utenti".

Ciao @Carlos:
Prova ad aggiungere il seguente codice al file functions.php
del tuo tema, oppure in un file .php
all'interno di un plugin che potresti star scrivendo (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) { // Non è l'amministratore, rimuovi l'amministratore
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 invece questo (dato che WordPress non ha aggiunto l'hook 'pre_user_query'
fino alla versione 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) { // Non è l'amministratore, rimuovi l'amministratore
global $wpdb;
$user_search->query_where = str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
}
}

Questo 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 di conseguenza. Nasconderà inoltre solo 1 amministratore, non tutti gli amministratori.

In realtà sono riuscito a farlo funzionare solo sulla versione 3.1. Lo stesso codice su versioni più vecchie non sembra funzionare (neanche su 3.04).

@EAMann - Vero, stavo semplificando. Se qualcuno ha bisogno di più funzionalità, ci darò un'occhiata.

@Mike—wow, sì, se volessi aiutarmi con questo sarebbe fantastico. Ho provato a modificare il codice senza successo. Per le mie esigenze l'ID Admin 1 va benissimo. Lo apprezzo molto.

@Carlos - Per chiarire, intendi che ti serve una versione 3.0.x o qualcos'altro?

Ecco una modifica alla risposta di MikeSchinkel che verifica se l'utente corrente ha il ruolo di amministratore e, in caso contrario, seleziona solo gli utenti che sono sottoscrittori.
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
);
}
}

Solo per informazione, per chi in futuro non sia molto esperto di SQL come me, se vuoi mostrare tutti gli utenti che non sono amministratori (Editori, Autori, Sottoscrittori ecc.) ma comunque nascondere gli amministratori, potresti cambiare questa riga: AND {$wpdb->usermeta}.meta_value = 0
e invece impostare il meta value < 10 così: AND {$wpdb->usermeta}.meta_value < 10)
che mostrerà tutti gli utenti e nasconderà tutti gli amministratori da tutti gli utenti indipendentemente dal loro livello.

I Livelli Utente sono deprecati, quindi questo metodo verifica le capacità invece:
/** Nascondi l'Amministratore dalla Lista Utenti **/
function isa_pre_user_query( $user_search ) {
if ( !current_user_can( 'administrator' ) ) { // Non è un Amministratore - Rimuovi Amministratore
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' );

Sei sicuro? Puoi citare una fonte? Questa azione è utilizzata nell'attuale trunk - vedi wp-includes/user.php, riga 549.
