Как проверить, играет ли пользователь определенную роль?

60

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

Я ищу такую ​​функцию, как:

is_user_in_role($user, "author");

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

jessegavin
источник

Ответы:

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
}
Rarst
источник
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была удалена, но эта функция больше недоступна.

sMyles
источник
Это удобно, когда мне нужно вызывать другие методы класса WP_User.
Джастин Ваултерс
0

Вот функция, которая принимает пользователя и роль для большей гибкости:

function my_has_role ($ user, $ role) {
  $ role = $ user-> role; 
  return in_array ($ role, (array) $ user-> role);
}

if (my_has_role ($ user, 'some_role')) {
  // делать вещи
}
Бен
источник
0

Вызов ролей в User Object $user->rolesне возвращает все роли. Правильный способ определить, есть ли у пользователя роль или возможность, заключается в следующем. (Это работает в wp версии 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;
       }
 }
Вакас Бухары
источник