¿Cómo verificar si un usuario tiene un rol específico?

60

Tengo un requisito bastante específico para mostrar texto diferente en una etiqueta de campo en la página de perfil del usuario en función del rol del usuario actual. Parece que no puedo entender cómo verificar si el uso actual es un "autor".

Estoy buscando una función como:

is_user_in_role($user, "author");

Me imagino que esto es bastante simple, pero he buscado demasiado tiempo sin una respuesta, así que pensé en publicarlo aquí.

jessegavin
fuente

Respuestas:

113

Si solo necesita esto para el usuario actual, current_user_can()acepte roles y capacidades.

ACTUALIZACIÓN : Pasar un nombre de rol a current_user_can()ya no está garantizado para funcionar correctamente (ver # 22624 ). En cambio, es posible que desee verificar el rol del usuario:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}
Rarst
fuente
10
Sé que esta publicación fue respondida hace mucho tiempo, pero si alguien llega aquí ... mire la documentación una vez más para current_user_can () -> "No pase un nombre de rol a current_user_can (), ya que esto no está garantizado para funciona correctamente (ver # 22624). En su lugar, es posible que desee probar la función de comprobación de roles de usuario creada por AppThemes ". ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld
1
^ Falta un soporte en la declaración if
Aajahid
1
@Aajahid editado :)
Rarst
10

Estaba buscando una manera de obtener el rol de un usuario utilizando la identificación del usuario. Esto es lo que se me ocurrió:

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

Entonces, una is_user_in_role()función podría implementarse así:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
Stephen M. Harris
fuente
1
funciona bien para mí obtener el primer rol asignado a un usuario.
Q Studio
¿Qué pasa con todos los roles asignados al usuario?
Vishal Kumar Sahu
1
@Vishal Kumar, esto verificará todas las funciones asignadas al usuario.
Stephen M. Harris
Esta función no existe, no estoy seguro de si era antigua o qué, pero debe usar la respuesta anterior o la que
publiqué a
2

También puede simplemente crear un nuevo objeto de usuario:

$user = new WP_User( $user_id );

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

No estoy seguro de qué versión get_user_roles_by_user_idse eliminó, pero ya no es una función disponible.

sMyles
fuente
Esto es útil cuando tengo que llamar a otros métodos de la clase WP_User.
Justin Waulters
0

Aquí hay una función que acepta un usuario y un rol para una mayor flexibilidad:

function my_has_role ($ usuario, $ rol) {
  $ roles = $ usuario-> roles; 
  return in_array ($ rol, (matriz) $ usuario-> roles);
}

if (my_has_role ($ user, 'some_role')) {
  //hacer cosas
}
Ben
fuente
0

Las llamadas a roles en User Object $user->rolesno devuelven todos los roles. La forma correcta de encontrar si el usuario tiene un rol o capacidad es la siguiente. (Esto funciona en wp versión 2.0.0 y superior). La siguiente función funciona con la identificación de usuario, puede obtener la identificación de usuario actual$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
fuente