Как получить название роли текущего пользователя? (WordPress)
У меня есть такой фрагмент кода:
$user = new WP_User(get_current_user_id());
echo $user->roles[1];
и он выводит слаг роли форума bbPress. (roles[0] будет общей ролью WordPress, но она мне не нужна.)
Мне нужно название роли, а не слаг. То есть, ожидаемый вывод должен быть что-то вроде "Keymaster", "Participant", "Spectator" и т.д.
Итак, как мне получить название роли текущего пользователя?

Не уверен, следует ли bbPress соглашениям WordPress, но в WP есть глобальный класс под названием $WP-roles
, который хранит информацию о ролях. Исходя из того, что у вас есть, можно определить роль текущего пользователя:
$current_role = $user->roles[1];
Затем получить список всех ролей:
$all_roles = $wp_roles->roles;
После этого перебрать массив $all_roles
и найти $current_role"
:
foreach ($all_roles as $role_key => $role_details) {
if ($role_key == $current_role) $current_role_name = $role_details['name'];
}
Теперь переменная $current_role_name
должна содержать отображаемое имя роли (однако я не проверял этот код).

Результатом является предупреждение: Invalid argument supplied for foreach()

Я не использую bbPress, поэтому не знаю, изменяет ли он структуру ролей. Если вы используете var_dump
для $all_roles
, вы сможете увидеть его структуру и адаптировать цикл foreach
с правильными аргументами.

Спасибо за этот фрагмент кода! У меня установлен Buddypress (и пользовательская тема), где можно добавлять несколько ролей для одного пользователя. Я немного изменил ваш код, чтобы это работало:
<?php
//Получить название роли по ID пользователя
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){
//подсчет количества ролей пользователя
$user_role_nr++;
//добавляем разделитель запятой, если ролей больше одной
if($user_role_nr > 1) { $user_role_list .= ", "; }
//добавляем название роли
$user_role_list .= translate_user_role($wp_roles->roles[$user_role]['name']);
}
//возвращаем список ролей пользователя
return $user_role_list;
}
}
?>

Возможно, они уже решили эту проблему. Но сейчас я только что написал это и решил поделиться.
<?php
//Получить название роли по ID пользователя
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(User ID here);?>

Вы можете получить переводимое название текущей роли пользователя (не слаг) с помощью следующей функции, вам просто нужно передать слаг текущей роли пользователя в качестве параметра:
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';
}
// Обратите внимание, что translate_user_role в настоящее время не работает во фронтенде.
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'] );
// выбор указанной роли
if ( $current_user_role_slug == $role ) {
$role_name = $name;
}
}
echo $role_name ;
}
Теперь получите слаг текущей роли пользователя с помощью следующего кода:
$user_meta = get_userdata(get_current_user_id());
$current_user_role_slug = $user_meta->roles[0];
Используйте функцию wp_get_current_user_translatable_role_name( $current_user_role_slug );
чтобы получить переводимое название текущей роли пользователя (не слаг).
ПРИМЕЧАНИЕ: Пользователь должен быть авторизован для просмотра названия роли.

@nmr вы можете просто вывести название переменной таким образом: <?php echo ucfirst($role_name); ?>
это выведет значения типа "Keymaster", "Participant", "Spectator", "administrator" и т.д.

Но это всё равно остаётся slug
. Что если роль будет вида slug='spectator_vip' name= 'VIP Spectator'
или slug= 'shop_manager' name= 'Shop Manager'
. Если у пользователя роль "editor" (slug встроенной роли), в списке пользователей, в зависимости от активного языка, вы можете увидеть "Editor", "Redaktor", "редактор". Нельзя предполагать, что название роли совпадает с её slug.

Вот как это можно сделать
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);
}
// затем вызываем функцию с параметром userid
echo get_user_role( 7 );
