Як перевірити, чи користувач перебуває у певній ролі?


59

У мене досить специфічна вимога показувати різний текст у мітці поля на сторінці профілю користувача на основі ролі поточного користувача. Я не можу зрозуміти, як перевірити, чи є поточне використання "автором".

Я шукаю таку функцію, як:

is_user_in_role($user, "author");

Я думаю, що це досить просто, але я занадто довго шукав без відповіді, тому думав, що опублікую його тут.

Відповіді:


113

Якщо вам це потрібно лише для поточного користувача, він current_user_can()приймає і ролі, і можливості.

ОНОВЛЕННЯ : Передача імені ролі current_user_can()більше не гарантовано працювати належним чином (див. # 22624 ). Натомість ви можете перевірити роль користувача:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}

10
Я знаю, що на цю публікацію давно відповіли, але якщо хтось потрапить сюди ... перегляньте документацію ще раз для current_user_can () -> "Не передайте ім'я ролі current_user_can (), оскільки це не гарантується працювати правильно (див. # 22624). Натомість, ви можете спробувати спробувати функцію перевірки ролі користувача, складену AppThemes. " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld

1
^ У заяві
if

1
@Aajahid відредаговано :)
Rarst

10

Я шукав спосіб отримати роль користувача, використовуючи ідентифікатор користувача. Ось що я придумав:

function get_user_roles_by_user_id( $user_id ) {
    $user = get_userdata( $user_id );
    return empty( $user ) ? array() : $user->roles;
}

Тоді is_user_in_role()функція може бути реалізована так:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

1
добре працює для мене, щоб отримати першу роль, призначену користувачеві.
Q Studio

Що з усіма ролями, призначеними користувачеві?
Вішал Кумар Саху

1
@ Vishal Kumar це дозволить перевірити всі ролі, призначені користувачеві.
Стівен М. Харріс

Цю функцію не існує, не впевнений, була вона стара чи що, але слід скористатися відповіддю вище, або тим, що я розмістив нижче
sMyles

2

Ви також можете просто створити новий об’єкт користувача:

$user = new WP_User( $user_id );

if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
    return true;
}

Не впевнений, у якій версії get_user_roles_by_user_idбуло видалено, але це вже не доступна функція.


Це зручно, коли мені потрібно викликати інші методи класу WP_User.
Джастін Уолтерс

0

Ось функція, яка приймає користувача та роль для більшої гнучкості:

функція my_has_role ($ користувач, $ роль) {
  $ role = $ user-> ролі; 
  повернути in_array ($ role, (масив) $ user-> role);
}

якщо (my_has_role ($ користувач, 'some_role')) {
  // робити речі
}

0

Виклик ролей на User Object $user->rolesне повертає всіх ролей. Наступний правильний спосіб виявити, чи є у користувача роль чи можливість. (Це працює у версії 2.0.0 і новішої версії.) Наступна функція працює з ідентифікатором користувача, за допомогою якого можна отримати поточний ідентифікатор користувача$current_user_id = get_current_user_id();

/**
 * Returns true if a user_id has a given role or capability
 * 
 * @param int $user_id
 * @param string $role_or_cap Role or Capability
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Wrong way to do it as in the accepted answer.
    $roles_and_caps = $u->get_role_caps(); //Correct way to do it as wp do multiple checks to fetch all roles

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.