Как получить название роли текущего пользователя? (WordPress)

19 сент. 2016 г., 14:58:05
Просмотры: 22K
Голосов: 2

У меня есть такой фрагмент кода:

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

и он выводит слаг роли форума bbPress. (roles[0] будет общей ролью WordPress, но она мне не нужна.)

Мне нужно название роли, а не слаг. То есть, ожидаемый вывод должен быть что-то вроде "Keymaster", "Participant", "Spectator" и т.д.

Итак, как мне получить название роли текущего пользователя?

1
Комментарии

Функция wp_get_current_user() должна вам помочь. Она возвращает все данные пользователя через класс `WP_User`.

bueltge bueltge
19 сент. 2016 г. 15:31:51
Все ответы на вопрос 5
2

Не уверен, следует ли 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 должна содержать отображаемое имя роли (однако я не проверял этот код).

19 сент. 2016 г. 15:30:42
Комментарии

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

booster booster
21 сент. 2016 г. 01:01:23

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

cjbj cjbj
21 сент. 2016 г. 10:17:11
0

Спасибо за этот фрагмент кода! У меня установлен 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;

    }
}
?>
10 июн. 2020 г. 13:05:25
0

Возможно, они уже решили эту проблему. Но сейчас я только что написал это и решил поделиться.

<?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);?>  
12 янв. 2020 г. 01:40:06
4

Вы можете получить переводимое название текущей роли пользователя (не слаг) с помощью следующей функции, вам просто нужно передать слаг текущей роли пользователя в качестве параметра:

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 ); чтобы получить переводимое название текущей роли пользователя (не слаг).

ПРИМЕЧАНИЕ: Пользователь должен быть авторизован для просмотра названия роли.

25 апр. 2019 г. 09:13:44
Комментарии

Цитата: "Мне нужно название роли (name), а не её slug."

nmr nmr
25 апр. 2019 г. 10:07:51

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

Razon Komar Pal Razon Komar Pal
28 апр. 2019 г. 07:56:44

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

nmr nmr
28 апр. 2019 г. 08:33:15

@nmr посмотрите мой изменённый код, я просто неверно понял суть вопроса, но теперь разобрался и исправил.

Razon Komar Pal Razon Komar Pal
28 апр. 2019 г. 10:48:57
1

Вот как это можно сделать

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 );
25 апр. 2019 г. 10:40:18
Комментарии

Код в текущем виде пытается перевести slug, что является плохим решением. Вам следует передать название роли в функцию translate_user_role().

nmr nmr
25 апр. 2019 г. 11:33:08