Come verificare se un utente appartiene a un ruolo specifico?

8 dic 2010, 17:47:46
Visualizzazioni: 285K
Voti: 104

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.

0
Tutte le risposte alla domanda 8
4
214

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"
}
8 dic 2010 17:54:09
Commenti

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)

bestprogrammerintheworld bestprogrammerintheworld
28 gen 2014 09:04:11

^ Manca una parentesi nell'istruzione if

Aajahid Aajahid
4 giu 2015 09:44:27

@Aajahid modificato :)

Rarst Rarst
4 giu 2015 10:52:13

Se non si utilizza multisite, preferisco ancora la semplicità di current_user_can('editor')

Jules Jules
25 gen 2020 21:37:31
4
15

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 ) );
}
11 giu 2012 17:18:41
Commenti

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

Q Studio Q Studio
10 ott 2012 22:07:41

E per quanto riguarda tutti i ruoli assegnati all'utente?

Vishal Kumar Sahu Vishal Kumar Sahu
10 apr 2017 10:14:28

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

Stephen M. Harris Stephen M. Harris
10 apr 2017 20:34:55

Questa funzione non esiste, non sono sicuro se fosse semplicemente vecchia o altro, ma dovresti utilizzare la risposta sopra o quella che ho pubblicato sotto

sMyles sMyles
16 nov 2017 02:41:38
0

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;
       }
 }
2 ott 2019 15:19:58
1
if(current_user_can('administrator')){
   code...
}
3 set 2021 21:51:59
Commenti

probabilmente l'idea migliore, ma potrebbe essere bello estenderla a qualsiasi utente, non solo a quello corrente

Mark Kaplun Mark Kaplun
15 apr 2022 08:56:22
1

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.

16 nov 2017 02:44:06
Commenti

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

Justin Waulters Justin Waulters
26 set 2019 02:18:58
0

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

function my_has_role($user, $role) {
  $roles = $user->roles; 
  return in_array($role, (array) $user->roles);
}

if(my_has_role($user, 'some_role')) {
  //esegui operazioni
}
29 nov 2017 01:05:00
0

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 );
}
30 mag 2024 17:15:24
0

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.

27 lug 2020 09:42:06