Come ottenere il ruolo di un utente

18 lug 2012, 22:39:50
Visualizzazioni: 36.5K
Voti: 17

Ho bisogno di ottenere il ruolo associato a un utente -- non "l'utente attualmente loggato".

Sto usando BuddyPress (anche se non dovrebbe influire sulla natura di questa domanda) e mi trovo nel loop bp_members().

Come posso recuperare il ruolo dell'utente su cui sto facendo il report nel loop in un determinato momento?

Grazie.

0
Tutte le risposte alla domanda 3
4
19

Utilizza l'ID utente e WP_User:

$user = new WP_User( $user_id );
print wp_sprintf_l( '%l', $user->roles );

Aggiornamento

/**
 * Ottieni i ruoli utente tramite ID utente.
 *
 * @param  int $id
 * @return array
 */
function wpse_58916_user_roles_by_id( $id )
{
    $user = new WP_User( $id );

    if ( empty ( $user->roles ) or ! is_array( $user->roles ) )
        return array ();

    $wp_roles = new WP_Roles;
    $names    = $wp_roles->get_names();
    $out      = array ();

    foreach ( $user->roles as $role )
    {
        if ( isset ( $names[ $role ] ) )
            $out[ $role ] = $names[ $role ];
    }

    return $out;
}

Esempio di utilizzo:

print '<pre>' 
    . htmlspecialchars( 
        print_r( wpse_58916_user_roles_by_id(1), TRUE ) 
        ) 
    . '</pre>';

Array
(
    [administrator] => Administrator
)
18 lug 2012 22:57:39
Commenti

Grazie @toscho -- non sembra darmi ciò che mi aspettavo. Ho ottenuto un editor, un valore vuoto/null e bbp_participant. Mi aspettavo di vedere Admin, Editor, Author o Subscriber poiché sono gli unici ruoli che stiamo utilizzando.

frank13 frank13
18 lug 2012 23:04:58

@frank13 Vedi il mio aggiornamento.

fuxia fuxia
18 lug 2012 23:15:34

Grazie @toscho ... è un sacco di codice per ottenere un dato che pensavo sarebbe stato più facilmente disponibile.

frank13 frank13
18 lug 2012 23:34:23

Molto utile, grazie! È davvero triste e confuso il fatto che non si possa accedere al ruolo dell'utente in modo più diretto. La funzione "can user" funziona all'opposto di ciò che la maggior parte delle persone vorrebbe.

Mike Mike
4 set 2013 01:44:19
5

Se bp_members restituisce un array di oggetti WP_User, ciascuno dovrebbe avere la proprietà roles che contiene un array dei ruoli dell'utente.

In alternativa, puoi usare get_user_meta per la chiave wp_capabilities, che restituirà un array di coppie role => capability:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
18 lug 2012 22:58:45
Commenti

$roles finisce per essere un array. Sto cercando di ottenere il ruolo del $user->ID. Solo un ruolo poiché nessun utente nel nostro sistema ha più di un ruolo assegnato.

frank13 frank13
18 lug 2012 23:07:23

$roles[0], fatto.

chrisguitarguy chrisguitarguy
18 lug 2012 23:09:10

Ok, grazie @ChristopherDavis ... $roles[0] restituisce "0" per ogni utente nella lista

frank13 frank13
18 lug 2012 23:15:32

@chrisguitarguy funziona ancora $roles[0]?

T.Todua T.Todua
28 mag 2015 13:14:48

$roles = reset(array_keys((array)$caps));

undefined undefined
18 ago 2020 13:46:17
0

Come ho capito, probabilmente è cambiato nel corso degli anni, ora non è più 'wp_capabilities'. Ho esaminato i file core di WordPress per vedere come lo gestiscono ora e ho trovato una nuova soluzione. Ecco il codice che uso attualmente:

global $wpdb;
$cap = get_user_meta( $wp_user_id, $wpdb->get_blog_prefix() . 'capabilities', true );

$cap viene restituito come un array associativo, ad esempio:

{
    "administrator": true
}

oppure

{
    "subscriber": true
}

Quindi nel tuo caso probabilmente dovresti ottenere le chiavi dell'array:

$caps_array = array_keys( $cap );

e poi estrarre tutto da lì. Io dovevo verificare se l'utente aveva il ruolo di amministratore, quindi ho controllato:

if ( is_array( $cap ) && !empty( $cap['administrator'] ) ) { return true; }

Avevo un ID utente, non l'intero oggetto WP_User, e non volevo usare soluzioni che creassero l'oggetto user. Come ho verificato, get_user_meta interroga direttamente il database per verificare questo parametro specifico, quindi questa dovrebbe essere la strada più veloce e con il minor consumo di risorse.

12 nov 2016 16:44:39