Comment obtenir le rôle de l'utilisateur

15

J'ai besoin d'obtenir le rôle associé à un utilisateur - pas "l'utilisateur actuellement connecté".

J'utilise Buddypress (ce n'est pas important pour la nature de cette question) et je suis dans la bp_members()boucle.

Comment puis-je récupérer le rôle de l'utilisateur sur lequel je fais un rapport dans la boucle à un moment donné?

Merci.

frank13
la source

Réponses:

17

Utilisez l'ID utilisateur et WP_User:

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

Mise à jour

/**
 * Get user roles by user ID.
 *
 * @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;
}

Exemple d'utilisation:

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

Array
(
    [administrator] => Administrator
)
fuxia
la source
Merci @toscho - cela ne m'a pas semblé m'attendre. J'ai obtenu un éditeur, une valeur vide / nulle et bbp_participant. Je m'attendais à voir Admin, Editor, Author ou Subscriber car ce sont les seuls rôles que nous utilisons.
frank13
@ frank13 Voir ma mise à jour.
fuxia
2
Merci @toscho ... c'est beaucoup de code pour obtenir une valeur de données que j'aurais pensé être plus facilement disponibles.
frank13
Très utile, merci! Tellement triste et déroutant, pourquoi vous ne pouvez pas accéder plus directement au rôle de l'utilisateur. La fonction "peut utilisateur" fonctionne à l'opposé de ce que la plupart des gens voudraient.
Mike
7

Si bp_membersrenvoie un tableau d' WP_Userobjets, chacun doit avoir une propriété rolesqui contient un tableau des rôles d'utilisateurs.

Sinon, vous pouvez utiliser get_user_metapour la clé wp_capabilities, qui renverra un tableau de role => capabilitypaires:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
chrisguitarguy
la source
$ roles finit par être un tableau. Je cherche à obtenir le $user->IDrôle de. Un seul rôle car aucun utilisateur de notre système ne se voit attribuer plus d'un rôle.
frank13
$roles[0], terminé.
chrisguitarguy
Ok, merci @ChristopherDavis ... $ roles [0] renvoie "0" dans tous les
domaines
@chrisguitarguy est-ce que $ roles [0] fonctionne toujours?
T.Todua
0

Si je comprends bien, cela a probablement changé au fil des ans, maintenant ce n'est pas le cas 'wp_capabilities'. J'ai regardé les fichiers WP principaux, comment ils le font maintenant, et j'ai trouvé une nouvelle solution à cela. Voici le code que j'utilise maintenant:

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

$cap vient ensuite comme un tableau associatif, par exemple:

{
    "administrator": true
}

ou

{
    "subscriber": true
}

Donc, dans votre cas, vous devriez probablement récupérer les clés du tableau:

$caps_array = array_keys( $cap );

et puis tout en tirer. J'avais besoin de voir si l'utilisateur avait le rôle d'administrateur, j'ai donc vérifié:

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

J'avais un ID utilisateur, pas tout l' WP_Userobjet, et je ne voulais pas utiliser de solution qui créerait l' userobjet. Comme je l'ai vérifié, get_user_metava directement à la base de données pour vérifier ce paramètre exact, donc cela devrait être l'itinéraire le plus rapide et le plus efficace en termes de ressources.

Olga Farber
la source