Come verificare se un utente ha un ruolo specifico?


60

Ho un requisito piuttosto specifico per mostrare testo diverso in un'etichetta di campo nella pagina del profilo utente in base al ruolo dell'utente corrente. Non riesco a capire come verificare se l'uso corrente è un "autore".

Sto cercando una funzione come:

is_user_in_role($user, "author");

Immagino sia abbastanza semplice, ma ho cercato troppo a lungo senza una risposta, quindi ho pensato di pubblicarlo qui.

Risposte:


113

Se questo è necessario solo per l'utente corrente current_user_can()accetta sia ruoli che funzionalità.

AGGIORNAMENTO : current_user_can()non è più garantito il corretto funzionamento del nome di un ruolo (vedere # 22624 ). Invece, potresti voler controllare il ruolo dell'utente:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}

10
So che questo post ha ricevuto risposta molto tempo fa, ma se qualcuno capita di arrivare qui ... guarda di nuovo la documentazione per current_user_can () -> "Non passare un nome di ruolo a current_user_can (), poiché non è garantito che funziona correttamente (vedi # 22624). Invece, potresti provare la funzione di controllo del ruolo utente messa insieme da AppThemes. " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld

1
^ Manca una parentesi
nell'istruzione

1
@Aajahid modificato :)
Rarst

10

Stavo cercando un modo per ottenere il ruolo di un utente usando l'ID dell'utente. Ecco cosa mi è venuto in mente:

function get_user_roles_by_user_id( $user_id ) {
    $user = get_userdata( $user_id );
    return empty( $user ) ? array() : $user->roles;
}

Quindi, una is_user_in_role()funzione 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 ) );
}

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

Che dire di tutti i ruoli assegnati all'utente?
Vishal Kumar Sahu,

1
@Vishal Kumar verificherà tutti i ruoli assegnati all'utente.
Stephen M. Harris,

Questa funzione non esiste, non sono sicuro se fosse solo vecchia o cosa, ma dovresti usare la risposta sopra o quella che ho pubblicato di seguito
sMyles

2

Puoi anche 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 di quale versione sia get_user_roles_by_user_idstata rimossa, ma non è più una funzione disponibile.


Questo è utile quando devo chiamare altri metodi della classe WP_User.
Justin Waulters,

0

Ecco una funzione che accetta un utente e un ruolo per una maggiore flessibilità:

funzione my_has_role ($ utente, $ ruolo) {
  $ ruoli = $ utente-> ruoli; 
  return in_array ($ role, (array) $ user-> ruoli);
}

if (my_has_role ($ user, 'some_role')) {
  //fare cose
}

0

La chiamata di ruoli sull'oggetto utente $user->rolesnon restituisce tutti i ruoli. Il modo corretto per scoprire se l'utente ha un ruolo o una capacità è il seguente. (Funziona con la versione 2.0.0 e successive di wp.) La seguente funzione funziona con l'ID utente da cui è possibile ottenere l'ID utente corrente$current_user_id = get_current_user_id();

/**
 * Returns true if a user_id has a given role or capability
 * 
 * @param int $user_id
 * @param string $role_or_cap Role or Capability
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Wrong way to do it as in the accepted answer.
    $roles_and_caps = $u->get_role_caps(); //Correct way to do it as wp do multiple checks to fetch all roles

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.