Verifică dacă utilizatorul este administrator după ID-ul utilizatorului
Aveți idei despre cum să verificați dacă un utilizator (după ID-ul utilizatorului) este administrator? Nu mă refer la utilizatorul curent autentificat.
// Metoda 1 - Folosind user_can()
$user_id = 123; // ID-ul utilizatorului de verificat
if ( user_can( $user_id, 'administrator' ) ) {
echo 'Utilizatorul este administrator';
}
// Metoda 2 - Verificarea directă a rolurilor
$user = get_userdata( $user_id );
if ( $user && in_array( 'administrator', (array) $user->roles ) ) {
echo 'Utilizatorul este administrator';
}

Ai formulat-o ca și cum ai vrea să verifici dacă utilizatorul are rolul de administrator. Este considerat mai corect să verifici abilitatea, relevantă pentru acțiunea specifică.
În practică, aceasta este de obicei exprimată ca current_user_can( 'manage_options' )
pentru utilizatorul curent. Pentru un utilizator arbitrar, ar fi user_can( $user_id, 'manage_options' )
.
Desigur, aceasta este o abilitate care reprezintă configurația generală a site-ului. În funcție de scopul tău, poți dori să folosești una diferită, vezi lista în documentația despre roluri și abilități.

Doar adaug la răspunsul lui @Rarst.
Tehnic, poți furniza numele rolului acelor funcții, deci current_user_can( 'administrator' )
sau user_can( $user_id, 'administrator' )
ar funcționa și ele, dar acest lucru este discurajat.
Deși verificarea împotriva anumitor roluri în locul unei capabilități este parțial acceptată, această practică este descurajată deoarece poate produce rezultate nesigure.
Notă: Va returna întotdeauna true dacă utilizatorul curent este un super admin, cu excepția cazului în care este specific interzis.
Ai putea verifica rolul fără a te baza pe acele funcții (deoarece acestea sunt nesigure), dar cum a spus @Rarst, este mai corect să verifici capabilități în loc de rol.
Unul dintre principalele avantaje ale utilizării capabilităților în locul rolurilor este următorul.
De exemplu, să presupunem că ai mai mult de un administrator pe site-ul tău. Să spunem că vrei ca clientul tău să fie admin, iar tu ești de asemenea admin al site-ului.
Acum are sens ca clientul tău să aibă privilegii de administrator pe site-ul său, dar s-ar putea să nu vrei ca el/ea să aibă posibilitatea de a instala pluginuri pe site. Aceasta ar fi treaba ta ca webmaster.
Deci dacă verifici rolurile, ești blocat la dezactivarea/activarea funcționalităților pentru toți cei din acel rol.
Dacă folosești capabilități, ai o granularitate mai mare în acordarea/restricționarea utilizatorilor pentru acțiuni specifice.
Revenind la scenariul meu, dacă vrei să-i oferi clientului tău privilegii de administrator dar să nu poată instala pluginuri, ar fi la fel de simplu ca
add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){
// capabilitatea cerută și ID-ul clientului nostru
if ( 'install_plugins' == $args[0] && $args[1] == 2 )
$allcaps[ $cap[0] ] = false;
return $allcaps;
}
am putea furniza o listă de diferite capabilități pe care am vrea să le restricționăm, de exemplu update_core
, manage_options
, install_plugins
, install_themes
etc.
Funcția noastră ar rămâne destul de simplă
add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){
$restricted_cap = array(
'update_core',
'manage_options',
'install_plugins',
'install_themes',
// etc.
);
foreach( $restricted_cap as $r_cap ){
// capabilitatea cerută și ID-ul clientului nostru
if ( $r_cap == $args[0] && $args[1] == 2 )
$allcaps[ $cap[0] ] = false;
}
return $allcaps;
}
După cum poți vedea, acest lucru este destul de eficient, nu necesită un rol special, nu adaugă o interogare suplimentară la baza de date, este executat la runtime și este ușor de scalat și întreținut.
Dacă logica ta depinde de un rol, atunci succes înțelegând utilizatori specifici, scenarii sau orice altceva fără a-ți smulge părul sau a crea o mulțime de roluri doar pentru a ține pasul cu toate cazurile posibile de utilizare.
Consultă codex-ul pentru mai multe informații despre filtrul user_has_cap
.

"Deși verificarea în funcție de anumite roluri în locul unei capabilități este parțial acceptată, această practică este descurajată deoarece poate produce rezultate nesigure." -> https://developer.wordpress.org/reference/functions/current_user_can/

Poți utiliza get_userdata() sau get_user_by() prin transmiterea ID-ului utilizatorului pentru a obține obiectul utilizator. Din acesta poți extrage rolul.
$user = get_userdata( $user_id );
if(!empty( $user ) && $user){
$user->roles // aici se află rolul, verifică pentru orice rol ai nevoie
}
Poți consulta acest răspuns pentru mai multe informații
