Cómo obtener el rol de usuario

15

Necesito obtener el rol asociado con un usuario, no el "usuario actualmente conectado".

Estoy usando Buddypress (no debería importar la naturaleza de esta pregunta) y estoy al tanto bp_members().

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

Gracias.

frank13
fuente

Respuestas:

17

Use la identificación de usuario y WP_User:

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

Actualizar

/**
 * Get user roles by user ID.
 *
 * @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
)
fuxia
fuente
Gracias @toscho, no parecía darme lo que esperaba. Tengo un editor, un valor en blanco / nulo y bbp_participant. Esperaba ver administrador, editor, autor o suscriptor, ya que esos son los únicos roles que estamos utilizando.
frank13
@ frank13 Vea mi actualización.
fuxia
2
Gracias @toscho ... eso es mucho código para obtener un valor de datos que hubiera pensado que estaría más disponible.
frank13
Muy útil, gracias! Tan triste y confuso, por qué no puedes acceder a la función del usuario más directamente. La función "puede usar" funciona al contrario de lo que la mayoría de las personas querrían.
Mike
7

Si bp_membersdevuelve una matriz de WP_Userobjetos, cada uno debe tener una propiedad rolesque contenga una matriz de los roles de los usuarios.

De lo contrario, puede usar get_user_metala clave wp_capabilities, que devolverá una matriz de role => capabilitypares:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
chrisguitarguy
fuente
$ roles termina siendo una matriz. Estoy buscando obtener el $user->IDpapel de. Solo un rol, ya que no hay usuarios en nuestro sistema, se les asigna más de 1 rol.
frank13
$roles[0], hecho.
chrisguitarguy
Ok, gracias @ChristopherDavis ... $ roles [0] devuelve "0" en todos los ámbitos para cada usuario en la lista
frank13
@chrisguitarguy ¿todavía funciona $ roles [0]?
T.Todua
0

Según tengo entendido, probablemente cambió con los años, ahora no lo es 'wp_capabilities'. Miré los archivos principales de WP, cómo lo hacen ahora, y encontré una nueva solución para esto. Aquí está el código que uso ahora:

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

$cap luego viene como una matriz asociativa, por ejemplo:

{
    "administrator": true
}

o

{
    "subscriber": true
}

Entonces, en su caso, probablemente debería obtener las claves de la matriz:

$caps_array = array_keys( $cap );

y luego obtener todo de él. Necesitaba ver si el usuario tenía el rol de administrador, así que verifiqué:

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

Tenía una identificación de usuario, no todo el WP_Userobjeto, y no quería usar ninguna solución que creara el userobjeto. Como verifiqué, get_user_metava directamente a la base de datos para verificar este parámetro exacto, por lo que esta debería ser la ruta más rápida y en cuanto a recursos.

Olga Farber
fuente