Как получить роль пользователя
Мне нужно получить роль, связанную с пользователем -- не "текущим авторизованным пользователем".
Я использую Buddypress (что не должно влиять на суть этого вопроса) и нахожусь в цикле bp_members()
.
Как я могу получить роль пользователя, о котором я получаю информацию в цикле в любой момент времени?
Спасибо.

Используйте 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
)

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

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

Если 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);

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

Хорошо, спасибо @ChristopherDavis... но $roles[0] возвращает "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
обращается напрямую к базе данных для получения этого параметра, поэтому такой подход должен быть самым быстрым и ресурсоэффективным.
