Cum se verifică dacă un utilizator are un anumit rol?
Am o cerință destul de specifică pentru a afișa text diferit într-o etichetă de câmp pe pagina de profil a utilizatorului în funcție de rolul utilizatorului curent. Nu reușesc să-mi dau seama cum să verific dacă utilizatorul curent este un "autor".
Caut o funcție de genul:
is_user_in_role($user, "author");
Îmi imaginez că este destul de simplu, dar am căutat prea mult timp fără un răspuns, așa că m-am gândit să postez aici.

Dacă ai nevoie doar pentru utilizatorul curent current_user_can()
acceptă atât roluri, cât și capabilități.
ACTUALIZARE: Transmiterea unui nume de rol către current_user_can()
nu mai este garantată să funcționeze corect (vezi #22624). În schimb, poate doriți să verificați rolul utilizatorului:
$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
//Utilizatorul are rolul de "autor"
}

Știu că acest post a fost rezolvat cu mult timp în urmă, dar dacă cineva ajunge aici... uitați-vă încă o dată la documentația pentru current_user_can() -> "Nu transmiteți un nume de rol către current_user_can(), deoarece acest lucru nu este garantat să funcționeze corect (vezi #22624). În schimb, puteți încerca funcția de verificare a rolului utilizatorului creată de AppThemes." (http://codex.wordpress.org/Function_Reference/current_user_can)

Căutam o modalitate de a obține rolul unui utilizator folosind ID-ul utilizatorului. Iată ce am creat:
function get_user_roles_by_user_id( $user_id ) {
$user = get_userdata( $user_id );
return empty( $user ) ? array() : $user->roles;
}
Apoi, o funcție is_user_in_role()
ar putea fi implementată astfel:
function is_user_in_role( $user_id, $role ) {
return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

funcționează bine pentru mine pentru a obține primul rol atribuit unui utilizator.

@Vishal Kumar acest lucru va verifica toate rolurile atribuite utilizatorului.

Apelarea rolurilor pe Obiectul User $user->roles
nu returnează toate rolurile. Metoda corectă pentru a afla dacă utilizatorul are un rol sau o capacitate este următoarea. (Aceasta funcționează în versiunea wp 2.0.0 și mai mare.) Următoarea funcție lucrează cu ID-ul utilizatorului, poți obține ID-ul utilizatorului curent prin $current_user_id = get_current_user_id();
/**
* Returnează true dacă un user_id are un anumit rol sau capacitate
*
* @param int $user_id
* @param string $role_or_cap Rol sau Capacitate
*
* @return boolean
*/
function my_has_role($user_id, $role_or_cap) {
$u = new \WP_User( $user_id );
//$u->roles Mod greșit de a face asta, ca în răspunsul acceptat.
$roles_and_caps = $u->get_role_caps(); //Mod corect de a face asta, deoarece wp face verificări multiple pentru a prelua toate rolurile
if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true )
{
return true;
}
}

De asemenea, poți crea pur și simplu un nou obiect utilizator:
$user = new WP_User( $user_id );
if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
return true;
}
Nu sunt sigur în ce versiune a fost eliminată funcția get_user_roles_by_user_id
, dar nu mai este o funcție disponibilă.

Dacă site-ul tău folosește WooCommerce, poți folosi pur și simplu:
wc_current_user_has_role( $role );
Dacă nu, poți crea funcția tu însuți copiind modul în care o face WooCommerce (combinând wc_current_user_has_role()
și wc_user_has_role()
):
/**
* Verifică dacă utilizatorul curent are un anumit rol.
*
* @param string $role Rolul.
* @return bool
*/
function mysite_current_user_has_role( $role ) {
/** @var null|WP_User $user */
$user = wp_get_current_user();
if ( ! is_object( $user ) ) {
$user = get_userdata( $user );
}
if ( ! $user || ! $user->exists() ) {
return false;
}
return in_array( $role, $user->roles, true );
}

Acest articol este vechi, dar iată o funcție universală care funcționează pe toate versiunile WordPress.
if(!function_exists('is_user')):
function is_user ($role=NULL, $user_id=NULL)
{
if(empty($user_id)){
$user = wp_get_current_user();
} else {
if(is_numeric($user_id) && $user_id == (int)$user_id) {
$user = get_user_by('id', (int)$user_id);
} else if(is_string($user_id) && $email = sanitize_email($user_id)) {
$user = get_user_by('email', $email);
} else {
return false;
}
}
if(!$user) return false;
return in_array( $role, (array)$user->roles, true ) !== false;
}
endif;
Cu această funcție puteți căuta utilizatorul conectat după rol sau după ID-ul/email-ul utilizatorului. De asemenea, acceptă și array de roluri de utilizator.
