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

8 dic 2010, 17:47:46
Vistas: 285K
Votos: 104

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í.

0
Todas las respuestas a la pregunta 8
4
214

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"
}
8 dic 2010 17:54:09
Comentarios

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)

bestprogrammerintheworld bestprogrammerintheworld
28 ene 2014 09:04:11

^ Falta un corchete en la declaración if

Aajahid Aajahid
4 jun 2015 09:44:27

@Aajahid editado :)

Rarst Rarst
4 jun 2015 10:52:13

Si no se está utilizando multisitio, sigo prefiriendo la simplicidad de current_user_can('editor')

Jules Jules
25 ene 2020 21:37:31
4
15

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 ) );
}
11 jun 2012 17:18:41
Comentarios

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

Q Studio Q Studio
10 oct 2012 22:07:41

¿Qué hay de todos los roles asignados al usuario?

Vishal Kumar Sahu Vishal Kumar Sahu
10 abr 2017 10:14:28

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

Stephen M. Harris Stephen M. Harris
10 abr 2017 20:34:55

Esta función no existe, no estoy seguro si era antigua o qué, pero deberías usar la respuesta de arriba o la que publiqué abajo

sMyles sMyles
16 nov 2017 02:41:38
0

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;
       }
 }
2 oct 2019 15:19:58
1
if(current_user_can('administrator')){
   code...
}
3 sept 2021 21:51:59
Comentarios

probablemente la mejor idea, pero podría ser bueno ampliarlo a cualquier usuario, no solo al actual

Mark Kaplun Mark Kaplun
15 abr 2022 08:56:22
1

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.

16 nov 2017 02:44:06
Comentarios

Esto es útil cuando tengo que llamar a otros métodos de la clase WP_User.

Justin Waulters Justin Waulters
26 sept 2019 02:18:58
0

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

function my_has_role($user, $role) {
  $roles = $user->roles; 
  return in_array($role, (array) $user->roles);
}

if(my_has_role($user, 'some_role')) {
  //hacer cosas
}
29 nov 2017 01:05:00
0

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 );
}
30 may 2024 17:15:24
0

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.

27 jul 2020 09:42:06