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

15

Мне нужно получить роль, связанную с пользователем, а не с «зарегистрированным пользователем».

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

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

Благодарю.

frank13
источник

Ответы:

17

Используйте идентификатор пользователя и WP_User:

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

Обновить

/**
 * Get user roles by user 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
)
Фуксия
источник
Спасибо @toscho - похоже, я не получил то, что ожидал. Я получил редактор, пустое / нулевое значение и bbp_participant. Я ожидал увидеть администратора, редактора, автора или подписчика, поскольку это единственные роли, которые мы используем.
frank13
@ frank13 Смотрите мое обновление.
fuxia
2
Спасибо @toscho ... это большой код для получения значения данных, который, я думаю, был бы более доступным.
frank13
Очень полезно, спасибо! Так грустно и сбивает с толку, почему вы не можете получить доступ к роли пользователя более напрямую. Функция «может пользователь» работает противоположно тому, что большинство людей хотели бы.
Майк
7

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

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

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
chrisguitarguy
источник
$ role заканчивается массивом. Я ищу, чтобы получить $user->IDроль. Только одна роль, так как никому из пользователей в нашей системе не назначено более одной роли.
frank13
$roles[0], сделано.
chrisguitarguy
Хорошо, спасибо @ChristopherDavis ... $ role [0] возвращает «0» для всех пользователей в списке
frank13
@chrisguitarguy работает ли $ role [0] по-прежнему?
Т.Тодуа
0

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

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

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

Ольга Фарбер
источник