Cum să Elimin Abilitatea Altor Utilizatori de a Vizualiza Administratorul în Lista de Utilizatori?
(Notă moderator: Titlul original era "Elimină Administrator din Meniul de Utilizatori")
Am creat un rol de administrator pentru clienți, care este în esență un Editor cu dreptul de a adăuga/elimina utilizatori. Articolul "Editorul poate crea orice utilizator nou, cu excepția administratorului" a fost excelent în a mă ajuta să prevîn noului meu rol de administrator client să editeze sau să creeze un utilizator cu drepturi de administrator real.
Totuși, ceea ce ar fi ideal ar fi să ascund administratorii de administratorii clienți atunci când aceștia vizualizează utilizatorii. Vreau ca ei să "creadă" că sunt administratorii site-ului lor, dar nu vreau să aibă posibilitatea să vadă măcar rolul/ utilizatorul meu—în esență, ascunzând rolul de "administrator" de ei când sunt în panoul "Utilizatori".

Salut @Carlos:
Încearcă să adaugi următoarele în fișierul functions.php
al temei tale, sau într-un fișier .php
dintr-un plugin pe care îl poți scrie (care funcționează pentru 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) { // Nu este administrator, elimină administratorul
global $wpdb;
$user_search->query_where = str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
}
}
Dacă ai WordPress 3.0.x încearcă această variantă (deoarece WordPress nu a adăugat cârligul 'pre_user_query'
până la versiunea 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) { // Nu este administrator, elimină administratorul
global $wpdb;
$user_search->query_where = str_replace('WHERE 1=1',
"WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
}
}

Aceasta ascunde doar primul utilizator adăugat (care este aproape întotdeauna administratorul)... dar dacă administratorul are un ID diferit de 1, va trebui să modifici interogarea în mod corespunzător. De asemenea, va ascunde doar 1 administrator, nu toți administratorii.

De fapt, am reușit să fac asta să funcționeze doar în versiunea 3.1. Același cod în versiuni mai vechi nu pare să funcționeze (nici măcar 3.04).

@EAMann - Corect, am fost comod. Dacă cineva are nevoie de mai mult, voi investiga.

@Carlos - Ai nevoie de versiunea 3.0.x sau versiunea 3.1 este acceptabilă?

@Mike—uau, da, dacă ai fi dispus să mă ajuți cu asta ar fi minunat. Am tot încercat fără succes. Pentru nevoile mele, Admin ID 1 funcționează perfect. Apreciez foarte mult.

@Carlos - Pentru clarificare, vrei să spui că ai nevoie de o versiune 3.0.x sau de altceva?

Iată o modificare a răspunsului lui MikeSchinkel care verifică dacă utilizatorul curent are rolul de administrator și, dacă nu, selectează doar utilizatorii care sunt abonați.
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
);
}
}

Doar pentru informație, pentru oricine în viitor care nu este foarte proficient în SQL, cum nu sunt nici eu, dacă doriți să afișați toți utilizatorii care nu sunt administratori (Editori, Autori, Abonați etc.) dar totuși să ascundeți administratorii, puteți modifica această linie: AND {$wpdb->usermeta}.meta_value = 0
și în schimb să setați valoarea meta la < 10 astfel: AND {$wpdb->usermeta}.meta_value < 10)
ceea ce va afișa toți utilizatorii și va ascunde toți administratorii de la toți utilizatorii indiferent de nivelul lor.

Nivelurile de Utilizator sunt învechite, așa că această metodă verifică în schimb capacitățile:
/** Ascunde Administratorul din Lista de Utilizatori **/
function isa_pre_user_query( $user_search ) {
if ( !current_user_can( 'administrator' ) ) { // Nu este Administrator - Elimină Administratorul
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' );

Ești sigur? Poți cita o sursă? Această acțiune este folosită în versiunea curentă de trunk - vezi wp-includes/user.php, linia 549.
