Comment vérifier si un utilisateur occupe un rôle spécifique?

60

J'ai une exigence assez spécifique pour afficher un texte différent dans une étiquette de champ sur la page de profil de l'utilisateur en fonction du rôle de l'utilisateur actuel. Je n'arrive pas à comprendre comment vérifier si l'utilisation actuelle est un "auteur".

Je cherche une fonction comme:

is_user_in_role($user, "author");

J'imagine que c'est assez simple, mais j'ai trop longtemps cherché sans réponse, alors j'ai pensé le poster ici.

Jessegavin
la source

Réponses:

113

Si vous n'en avez besoin que pour l'utilisateur actuel, current_user_can()acceptez les rôles et les fonctionnalités.

UPDATE : Il current_user_can()n'est plus garanti que le passage d'un nom de rôle à fonctionne correctement (voir # 22624 ). Au lieu de cela, vous voudrez peut-être vérifier le rôle de l'utilisateur:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}
Rarst
la source
10
Je sais que ce message a reçu une réponse il y a longtemps, mais si quelqu'un arrive ici ... consultez à nouveau la documentation de current_user_can () -> "Ne donnez pas un nom de rôle à current_user_can (), car cela n'est pas garanti. correctement (voir le numéro 22624). Au lieu de cela, vous voudrez peut-être essayer la fonction de vérification du rôle de l'utilisateur créée par AppThemes. " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld
1
^ Il manque une parenthèse dans la déclaration if
Aajahid
1
@Aajahid édité :)
Rarst
10

Je cherchais un moyen d'obtenir le rôle d'un utilisateur à l'aide de son identifiant. Voici ce que je suis venu avec:

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

Ensuite, une is_user_in_role()fonction pourrait être implémentée comme suit:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
Stephen M. Harris
la source
1
fonctionne bien pour moi d’obtenir le premier rôle attribué à un utilisateur.
Q Studio
Qu'en est-il de tous les rôles attribués à l'utilisateur?
Vishal Kumar Sahu
1
@Vishal Kumar cela vérifiera tous les rôles assignés à l'utilisateur.
Stephen M. Harris
Cette fonction n'existe pas, ne savez pas si elle était simplement ancienne ou quoi, mais vous devez utiliser la réponse ci-dessus ou celle que j'ai postée ci
sMyles
2

Vous pouvez également simplement créer un nouvel objet utilisateur:

$user = new WP_User( $user_id );

if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
    return true;
}

Vous ne savez pas quelle version a get_user_roles_by_user_idété supprimée, mais ce n'est plus une fonction disponible.

sMyles
la source
C'est pratique lorsque je dois appeler d'autres méthodes de la classe WP_User.
Justin Waulters le
0

Voici une fonction qui accepte un utilisateur et un rôle pour plus de flexibilité:

function my_has_role ($ user, $ role) {
  $ rôles = $ utilisateur-> rôles; 
  return in_array ($ role, (tableau) $ user-> rôles);
}

if (my_has_role ($ user, 'some_role')) {
  //faire des trucs
}
Ben
la source
0

L'appel de rôles sur l'objet utilisateur $user->rolesne renvoie pas tous les rôles. La manière correcte de déterminer si l'utilisateur a un rôle ou une capacité est la suivante. (Cela fonctionne dans les versions 2.0.0 et supérieures de wp.) La fonction suivante fonctionne avec un ID utilisateur, vous pouvez obtenir le$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;
       }
 }
Waqas Bukhary
la source