Cómo obtener el rol de un usuario

18 jul 2012, 22:39:50
Vistas: 36.5K
Votos: 17

Necesito obtener el rol asociado a un usuario -- no el "usuario actualmente conectado".

Estoy usando BuddyPress (aunque no debería afectar a la naturaleza de esta pregunta) y estoy en el bucle bp_members().

¿Cómo puedo recuperar el rol del usuario sobre el que estoy informando en el bucle en cualquier momento dado?

Gracias.

0
Todas las respuestas a la pregunta 3
4
19

Utiliza el ID de usuario y WP_User:

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

Actualización

/**
 * Obtener roles de usuario por ID de usuario.
 *
 * @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;
}

Ejemplo de uso:

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

Array
(
    [administrator] => Administrator
)
18 jul 2012 22:57:39
Comentarios

Gracias @toscho -- no pareció darme lo que esperaba. Obtuve un editor, un valor en blanco/nulo y bbp_participant. Esperaba ver Admin, Editor, Author o Subscriber ya que esos son los únicos roles que estamos usando.

frank13 frank13
18 jul 2012 23:04:58

@frank13 Mira mi actualización.

fuxia fuxia
18 jul 2012 23:15:34

Gracias @toscho ... eso es mucho código para obtener un valor de datos que pensé que estaría más fácilmente disponible.

frank13 frank13
18 jul 2012 23:34:23

¡Muy útil, gracias! Qué triste y confuso que no puedas acceder al rol del usuario de manera más directa. La función "can user" funciona al revés de lo que la mayoría de la gente esperaría.

Mike Mike
4 sept 2013 01:44:19
5

Si bp_members devuelve un array de objetos WP_User, cada uno debería tener la propiedad roles que contiene un array de los roles del usuario.

De lo contrario, puedes usar get_user_meta con la clave wp_capabilities, que devolverá un array de pares rol => capacidad:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
18 jul 2012 22:58:45
Comentarios

$roles termina siendo un array. Estoy buscando obtener el rol del $user->ID. Solo un rol ya que ningún usuario en nuestro sistema tiene asignado más de un rol.

frank13 frank13
18 jul 2012 23:07:23

$roles[0], listo.

chrisguitarguy chrisguitarguy
18 jul 2012 23:09:10

Ok, gracias @ChristopherDavis ... $roles[0] devuelve "0" para todos los usuarios en la lista

frank13 frank13
18 jul 2012 23:15:32

@chrisguitarguy ¿funciona todavía $roles[0]?

T.Todua T.Todua
28 may 2015 13:14:48

$roles = reset(array_keys((array)$caps));

undefined undefined
18 ago 2020 13:46:17
0

Según entiendo, probablemente ha cambiado con los años, ahora no es 'wp_capabilities'. Revisé los archivos principales de WP para ver cómo lo hacen ahora y encontré una nueva solución para esto. Este es el código que uso actualmente:

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

$cap viene como un array asociativo, por ejemplo:

{
    "administrator": true
}

o

{
    "subscriber": true
}

Entonces, en tu caso probablemente deberías obtener las claves del array:

$caps_array = array_keys( $cap );

y luego obtener todo de ahí. Yo necesitaba verificar si el usuario tenía el rol de administrador, así que comprobé:

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

Tenía un ID de usuario, no el objeto completo WP_User, y no quería usar ninguna solución que creara el objeto user. Según verifiqué, get_user_meta va directamente a la base de datos para buscar este parámetro exacto, por lo que esta debería ser la ruta más rápida y eficiente en términos de recursos.

12 nov 2016 16:44:39