¿Cómo obtener el Nombre del Rol del usuario actual? (WordPress)

19 sept 2016, 14:58:05
Vistas: 22K
Votos: 2

Actualmente tengo este fragmento de código:

$user = new WP_User(get_current_user_id()); 
echo $user->roles[1];

y la salida es el slug del rol del foro bbPress. (roles[0] sería el rol general de WP pero no lo necesito.)

Lo que necesito es el nombre del rol, no el slug. Por lo tanto, la salida esperada debería ser algo como "Keymaster", "Participant", "Spectator" etc.

Entonces, ¿cómo obtengo el Nombre del Rol del usuario actual?

1
Comentarios

La función wp_get_current_user() debería ayudarte. Obtendrás todos los datos del usuario a través de la clase WP_User.

bueltge bueltge
19 sept 2016 15:31:51
Todas las respuestas a la pregunta 5
2

No estoy seguro si bbPress sigue las convenciones de WordPress, pero WP tiene una clase global llamada $WP-roles que contiene la información de los roles. Entonces, partiendo de lo que tienes, aquí está el rol del usuario actual:

$current_role = $user->roles[1];

Luego, recupera una lista de todos los roles:

$all_roles = $wp_roles->roles; 

Después, recorre $all_roles y encuentra el $current_role":

foreach ($all_roles as $role_key => $role_details) {
  if ($role_key == $current_role) $current_role_name = $role_details['name'];
  }

Ahora, $current_role_name debería contener el nombre para mostrar que estás buscando (sin embargo, no he verificado este código).

19 sept 2016 15:30:42
Comentarios

El resultado es un aviso que dice: Invalid argument supplied for foreach()

booster booster
21 sept 2016 01:01:23

No uso bbPress, así que no sé si hace algo con la estructura de roles. Si usas var_dump en $all_roles deberías poder ver su estructura y adaptar el bucle foreach con los argumentos correctos.

cjbj cjbj
21 sept 2016 10:17:11
0

¡Gracias por este fragmento de código! Estoy ejecutando una instalación de Buddypress (y un tema personalizado) donde es posible agregar múltiples roles a un usuario. Ajusté un poco tu código para que funcione:

<?php
//Obtener nombre del rol por ID de usuario
if( !function_exists('get_user_role_name') ){
    function get_user_role_name($user_ID){
    global $wp_roles;

        $user_data = get_userdata($user_ID);
        $user_role_slug = $user_data->roles;

        foreach($user_role_slug as $user_role){
            //contar número de roles del usuario
            $user_role_nr++;
            //agregar separación por coma si hay más de un rol
            if($user_role_nr > 1) { $user_role_list .= ", "; }
            //agregar nombre del rol
            $user_role_list .= translate_user_role($wp_roles->roles[$user_role]['name']);
        }

    //retornar lista de roles del usuario
    return $user_role_list;

    }
}
?>
10 jun 2020 13:05:25
0

Tal vez ya hayan resuelto este problema. Pero, ahora acabo de escribir esto y decidí compartirlo.

<?php
//Obtener el nombre del rol por ID de usuario
if( !function_exists('get_user_role_name') ){
    function get_user_role_name($user_ID){
        global $wp_roles;

        $user_data = get_userdata($user_ID);
        $user_role_slug = $user_data->roles[0];
        return translate_user_role($wp_roles->roles[$user_role_slug]['name']);
    }
}
?>

<?php echo get_user_role_name(ID de usuario aquí);?>
12 ene 2020 01:40:06
4

Puedes obtener el nombre del rol del usuario actual (nombre traducible pero no el slug) con la siguiente función, solo necesitas pasar el slug del rol del usuario actual como parámetro:

function wp_get_current_user_translatable_role_name( $current_user_role_slug = '' ) {
    $role_name = '';

    if ( ! function_exists( 'get_editable_roles' ) ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
    }

    // Ten en cuenta que translate_user_role no funciona actualmente en el front-end.
    load_textdomain( 'default', WP_LANG_DIR . '/admin-' . get_locale() . '.mo' );

    $editable_roles = array_reverse( get_editable_roles() );

    foreach ( $editable_roles as $role => $details ) {
        $name = translate_user_role( $details['name'] );
        // pre-seleccionar el rol especificado
        if ( $current_user_role_slug == $role ) {
            $role_name  = $name;
        }
    }

    echo $role_name ;
}

Ahora, obtén el slug del rol del usuario actual con el siguiente código:

$user_meta = get_userdata(get_current_user_id());
$current_user_role_slug = $user_meta->roles[0];

Usa la función wp_get_current_user_translatable_role_name( $current_user_role_slug ); para obtener el nombre del rol del usuario actual (nombre traducible pero no el slug).

NOTA: El usuario debe haber iniciado sesión para ver el nombre del rol.

25 abr 2019 09:13:44
Comentarios

Cita: "Lo que necesito es el nombre del rol, no el slug."

nmr nmr
25 abr 2019 10:07:51

@nmr puedes simplemente imprimir el nombre de la variable así: <?php echo ucfirst($role_name); ?> esto debería mostrar algo como "Keymaster", "Participant", "Spectator", "administrator", etc.

Razon Komar Pal Razon Komar Pal
28 abr 2019 07:56:44

Pero sigue siendo un slug. ¿Qué pasa si el rol es algo como slug='spectator_vip' nombre= 'Espectador VIP' o slug= 'shop_manager' nombre= 'Gestor de Tienda'. Si un usuario tiene el rol "editor" (slug del rol predefinido), en la lista de usuarios, dependiendo del idioma activo, puedes ver "Editor", "Redaktor", "редактор". No puedes asumir que el nombre es igual al slug.

nmr nmr
28 abr 2019 08:33:15

@nmr mira mi código modificado, simplemente no entendí bien el punto de la pregunta pero ahora lo comprendo y lo he solucionado.

Razon Komar Pal Razon Komar Pal
28 abr 2019 10:48:57
1

Aquí está la forma de obtenerlo

function get_user_role($user_id) {
    global $wp_roles;

    $roles = array();
    $user = new WP_User( $user_id );
    if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
    foreach ( $user->roles as $role )
        $roles[] .= translate_user_role( $role );
    }
    return implode(', ',$roles);
} 
//luego llamar a la función con el parámetro userid
echo get_user_role( 7 );
25 abr 2019 10:40:18
Comentarios

El código en su forma actual intenta traducir el slug, lo cual es una solución deficiente. Deberías pasar el nombre del rol a la función translate_user_role().

nmr nmr
25 abr 2019 11:33:08