Come verificare se un utente appartiene a un ruolo specifico?
Ho un requisito piuttosto specifico per mostrare un testo diverso nell'etichetta di un campo nella pagina del profilo utente in base al ruolo dell'utente corrente. Non riesco a capire come verificare se l'utente corrente è un "autore".
Sto cercando una funzione come:
is_user_in_role($user, "author");
Immagino che sia piuttosto semplice, ma ho cercato per troppo tempo senza trovare una risposta, quindi ho pensato di pubblicare la domanda qui.

Se hai bisogno di questo solo per l'utente corrente current_user_can()
accetta sia ruoli che capacità.
AGGIORNAMENTO: Passare un nome di ruolo a current_user_can()
non è più garantito che funzioni correttamente (vedi #22624). Invece, potresti voler controllare il ruolo dell'utente:
$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
//L'utente ha il ruolo "author"
}

So che questo post ha ricevuto risposta molto tempo fa, ma se qualcuno dovesse capitare qui... date un'occhiata ancora alla documentazione per current_user_can() -> "Non passare un nome di ruolo a current_user_can(), poiché questo non è garantito funzionare correttamente (vedi #22624). Invece, potresti voler provare la funzione di controllo del ruolo utente messa insieme da AppThemes." (http://codex.wordpress.org/Function_Reference/current_user_can)

Stavo cercando un modo per ottenere il ruolo di un utente utilizzando l'ID dell'utente. Ecco cosa ho elaborato:
function get_user_roles_by_user_id( $user_id ) {
$user = get_userdata( $user_id );
return empty( $user ) ? array() : $user->roles;
}
Quindi, una funzione is_user_in_role()
potrebbe essere implementata in questo modo:
function is_user_in_role( $user_id, $role ) {
return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

funziona bene per me per ottenere il primo ruolo assegnato a un utente.

@Vishal Kumar questo controllerà tutti i ruoli assegnati all'utente.

Chiamare i ruoli sull'oggetto User $user->roles
non restituisce tutti i ruoli. Il modo corretto per verificare se un utente ha un ruolo o una capacità è il seguente. (Questo funziona nella versione wp 2.0.0 e successive.) La seguente funzione funziona con l'ID utente che puoi ottenere per l'utente corrente con $current_user_id = get_current_user_id();
/**
* Restituisce true se un user_id ha un determinato ruolo o capacità
*
* @param int $user_id
* @param string $role_or_cap Ruolo o Capacità
*
* @return boolean
*/
function my_has_role($user_id, $role_or_cap) {
$u = new \WP_User( $user_id );
//$u->roles Modo sbagliato di farlo come nella risposta accettata.
$roles_and_caps = $u->get_role_caps(); //Modo corretto di farlo poiché wp esegue controlli multipli per recuperare tutti i ruoli
if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true )
{
return true;
}
}

Puoi anche semplicemente creare un nuovo oggetto utente:
$user = new WP_User( $user_id );
if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
return true;
}
Non sono sicuro in quale versione get_user_roles_by_user_id
sia stata rimossa, ma non è più una funzione disponibile.

Se il tuo sito utilizza WooCommerce, puoi semplicemente usare:
wc_current_user_has_role( $role );
Se non lo utilizzi, puoi creare la funzione da solo copiando il modo in cui WooCommerce la implementa (combinando wc_current_user_has_role()
e wc_user_has_role()
):
/**
* Verifica se l'utente corrente ha un ruolo.
*
* @param string $role Il ruolo.
* @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 );
}

Questo è un post vecchio ma ecco una funzione universale che funziona su tutte le versioni di WordPress.
if(!function_exists('is_user')):
function is_user ($role=NULL, $user_id=NULL)
{
// Se l'ID utente non è specificato, ottieni l'utente corrente
if(empty($user_id)){
$user = wp_get_current_user();
} else {
// Controlla se l'ID utente è numerico
if(is_numeric($user_id) && $user_id == (int)$user_id) {
$user = get_user_by('id', (int)$user_id);
}
// Controlla se l'ID utente è una stringa email valida
else if(is_string($user_id) && $email = sanitize_email($user_id)) {
$user = get_user_by('email', $email);
} else {
return false;
}
}
// Se l'utente non esiste, restituisci false
if(!$user) return false;
// Controlla se l'utente ha il ruolo specificato
return in_array( $role, (array)$user->roles, true ) !== false;
}
endif;
Con questa funzione puoi cercare l'utente loggato per ruolo o per ID utente/email. Accetta anche un array di ruoli utente.
