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


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.