Як отримати роль користувача


15

Мені потрібно отримати роль, пов’язану з користувачем - не "користувачем, який зараз увійшов".

Я використовую Buddypress (це не має значення характеру цього питання) і я перебуваю в bp_members()циклі.

Як я можу отримати роль користувача, про якого я повідомляю в циклі в будь-який момент часу?

Спасибі.

Відповіді:


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 Дивіться моє оновлення.
фуксія

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

$ role закінчується як масив. Я шукаю $user->IDроль ролі. Тільки одній ролі, оскільки жодним користувачам у нашій системі не призначено більше 1 ролі.
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прямує до db, щоб перевірити наявність цього точного параметра, тож це має бути найшвидший та ресурсний ресурс.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.