¿Cómo obtener el Nombre del Rol del usuario actual? (WordPress)
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?

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

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

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.

¡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;
}
}
?>

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í);?>

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.

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

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.

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 );
