Как получить роль пользователя

18 июл. 2012 г., 22:39:50
Просмотры: 36.5K
Голосов: 17

Мне нужно получить роль, связанную с пользователем -- не "текущим авторизованным пользователем".

Я использую Buddypress (что не должно влиять на суть этого вопроса) и нахожусь в цикле bp_members().

Как я могу получить роль пользователя, о котором я получаю информацию в цикле в любой момент времени?

Спасибо.

0
Все ответы на вопрос 3
4
19

Используйте ID пользователя и WP_User:

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

Обновление

/**
 * Получает роли пользователя по его 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;
}

Пример использования:

print '<pre>' 
    . htmlspecialchars( 
        print_r( wpse_58916_user_roles_by_id(1), TRUE ) 
        ) 
    . '</pre>';

Array
(
    [administrator] => Administrator
)
18 июл. 2012 г. 22:57:39
Комментарии

Спасибо @toscho — это не дало мне ожидаемого результата. Я получил редактора, пустое/нулевое значение и bbp_participant. Я ожидал увидеть Администратора, Редактора, Автора или Подписчика, так как это единственные роли, которые мы используем.

frank13 frank13
18 июл. 2012 г. 23:04:58

@frank13 Смотрите мое обновление.

fuxia fuxia
18 июл. 2012 г. 23:15:34

Спасибо @toscho ... это много кода для получения значения данных, которое, как я думал, должно быть более доступным.

frank13 frank13
18 июл. 2012 г. 23:34:23

Очень полезно, спасибо! Так грустно и непонятно, почему нельзя получить доступ к роли пользователя более прямым способом. Функция "can user" работает противоположно тому, что ожидает большинство пользователей.

Mike Mike
4 сент. 2013 г. 01:44:19
5

Если bp_members возвращает массив объектов WP_User, каждый из них должен иметь свойство roles, содержащее массив ролей пользователя.

В противном случае, вы можете использовать get_user_meta для ключа wp_capabilities, который вернёт массив пар роль => возможность:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
18 июл. 2012 г. 22:58:45
Комментарии

Переменная $roles является массивом. Мне нужно получить роль пользователя по $user->ID. Только одну роль, так как в нашей системе у пользователей не может быть больше одной роли.

frank13 frank13
18 июл. 2012 г. 23:07:23

$roles[0], готово.

chrisguitarguy chrisguitarguy
18 июл. 2012 г. 23:09:10

Хорошо, спасибо @ChristopherDavis... но $roles[0] возвращает "0" для всех пользователей в списке

frank13 frank13
18 июл. 2012 г. 23:15:32

@chrisguitarguy работает ли еще $roles[0]?

T.Todua T.Todua
28 мая 2015 г. 13:14:48

$roles = reset(array_keys((array)$caps));

undefined undefined
18 авг. 2020 г. 13:46:17
0

Насколько я понимаю, со временем это изменилось, и теперь используется не 'wp_capabilities'. Я изучил исходные файлы WordPress, чтобы узнать, как это реализовано сейчас, и нашёл новое решение. Вот код, который я использую:

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

$cap возвращается как ассоциативный массив, например:

{
    "administrator": true
}

или

{
    "subscriber": true
}

В вашем случае, скорее всего, нужно получить ключи массива:

$caps_array = array_keys( $cap );

и затем работать с ними. Мне нужно было проверить, есть ли у пользователя роль администратора, поэтому я использовал:

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

У меня был только ID пользователя, а не весь объект WP_User, и я не хотел использовать решения, которые создают объект пользователя. Как я проверил, get_user_meta обращается напрямую к базе данных для получения этого параметра, поэтому такой подход должен быть самым быстрым и ресурсоэффективным.

12 нояб. 2016 г. 16:44:39