¿Cómo comprobar si un usuario tiene un rol específico?
Tengo un requisito bastante específico para mostrar diferentes textos en una etiqueta de campo en la página de perfil de usuario basándome en el rol actual del usuario. No puedo descubrir cómo verificar si el usuario actual es un "autor".
Estoy buscando una función como:
is_user_in_role($user, "author");
Imagino que esto es bastante simple, pero he estado buscando durante demasiado tiempo sin encontrar una respuesta, así que pensé en publicarlo aquí.

Si solo necesitas esto para el usuario actual, current_user_can()
acepta tanto roles como capacidades.
ACTUALIZACIÓN: Pasar un nombre de rol a current_user_can()
ya no garantiza un funcionamiento correcto (ver #22624). En su lugar, puedes verificar el rol del usuario de esta manera:
$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
//El usuario tiene el rol "author"
}

Sé que esta publicación fue respondida hace mucho tiempo, pero si alguien llega hasta aquí... revise la documentación una vez más para current_user_can() -> "No pase un nombre de rol a current_user_can(), ya que no se garantiza que funcione correctamente (ver #22624). En su lugar, puede intentar la función de comprobación de rol de usuario creada por AppThemes." (http://codex.wordpress.org/Function_Reference/current_user_can)

Estaba buscando una manera de obtener el rol de un usuario utilizando su ID. 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;
}
Luego, una función is_user_in_role()
podría implementarse así:
function is_user_in_role( $user_id, $role ) {
return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

Funciona bien para mí para obtener el primer rol asignado a un usuario.

@Vishal Kumar esto verificará todos los roles asignados al usuario.

Llamar a roles en el Objeto Usuario $user->roles
no devuelve todos los roles. La forma correcta de averiguar si un usuario tiene un rol o capacidad es la siguiente. (Esto funciona en wp versión 2.0.0 y superiores.) La siguiente función funciona con el ID de usuario, puedes obtener el ID del usuario actual con $current_user_id = get_current_user_id();
/**
* Devuelve verdadero si un user_id tiene un rol o capacidad determinada
*
* @param int $user_id
* @param string $role_or_cap Rol o Capacidad
*
* @return boolean
*/
function my_has_role($user_id, $role_or_cap) {
$u = new \WP_User( $user_id );
//$u->roles Forma incorrecta de hacerlo como en la respuesta aceptada.
$roles_and_caps = $u->get_role_caps(); //Forma correcta de hacerlo ya que wp realiza múltiples comprobaciones para obtener todos los roles
if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true )
{
return true;
}
}

También puedes 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 en qué versión se eliminó get_user_roles_by_user_id
, pero ya no es una función disponible.

Si tu sitio está usando WooCommerce, puedes simplemente usar:
wc_current_user_has_role( $role );
Si no, puedes crear la función tú mismo copiando la forma en que WooCommerce lo hace (combinando wc_current_user_has_role()
y wc_user_has_role()
):
/**
* Comprueba si el usuario actual tiene un rol.
*
* @param string $role El rol.
* @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 );
}

Este es un post antiguo pero aquí hay una función universal que funciona en todas las versiones de WordPress.
if(!function_exists('is_user')):
function is_user ($role=NULL, $user_id=NULL)
{
if(empty($user_id)){
$user = wp_get_current_user();
} else {
if(is_numeric($user_id) && $user_id == (int)$user_id) {
$user = get_user_by('id', (int)$user_id);
} else if(is_string($user_id) && $email = sanitize_email($user_id)) {
$user = get_user_by('email', $email);
} else {
return false;
}
}
if(!$user) return false;
return in_array( $role, (array)$user->roles, true ) !== false;
}
endif;
Con esta función puedes buscar un usuario conectado por rol o por ID de usuario/correo electrónico. También acepta un array de roles de usuario.
