Как проверить, находится ли пользователь в определенной роли?

8 дек. 2010 г., 17:47:46
Просмотры: 285K
Голосов: 104

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

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

is_user_in_role($user, "author");

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

0
Все ответы на вопрос 8
4
214

Если вам это нужно только для текущего пользователя, current_user_can() принимает как роли, так и возможности.

ОБНОВЛЕНИЕ: Передача имени роли в current_user_can() больше не гарантирует корректную работу (см. #22624). Вместо этого, возможно, вы захотите проверить роль пользователя:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //Пользователь имеет роль "author"
}
8 дек. 2010 г. 17:54:09
Комментарии

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

bestprogrammerintheworld bestprogrammerintheworld
28 янв. 2014 г. 09:04:11

^ В условии if не хватает скобки

Aajahid Aajahid
4 июн. 2015 г. 09:44:27

@Aajahid отредактировано :)

Rarst Rarst
4 июн. 2015 г. 10:52:13

Если не используется мультисайт, я все равно предпочитаю простоту current_user_can('editor')

Jules Jules
25 янв. 2020 г. 21:37:31
4
15

Я искал способ получить роль пользователя, используя идентификатор пользователя. Вот что я придумал:

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 ) );
}
11 июн. 2012 г. 17:18:41
Комментарии

работает нормально, чтобы получить первую роль, назначенную пользователю.

Q Studio Q Studio
10 окт. 2012 г. 22:07:41

А как насчет всех ролей, назначенных пользователю?

Vishal Kumar Sahu Vishal Kumar Sahu
10 апр. 2017 г. 10:14:28

@Vishal Kumar это проверит все роли, назначенные пользователю.

Stephen M. Harris Stephen M. Harris
10 апр. 2017 г. 20:34:55

Эта функция не существует, не уверен, была ли она просто устаревшей или что-то еще, но вам следует использовать ответ выше или тот, который я опубликовал ниже

sMyles sMyles
16 нояб. 2017 г. 02:41:38
0

Вызов ролей на объекте пользователя $user->roles не возвращает все роли. Правильный способ узнать, имеет ли пользователь определенную роль или возможность, показан ниже. (Это работает в версии WordPress 2.0.0 и выше.) Следующая функция работает с ID пользователя, вы можете получить ID текущего пользователя с помощью $current_user_id = get_current_user_id();

/**
 * Возвращает true, если пользователь с указанным ID имеет заданную роль или возможность
 * 
 * @param int $user_id
 * @param string $role_or_cap Роль или Возможность
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Неправильный способ, как в принятом ответе.
    $roles_and_caps = $u->get_role_caps(); //Правильный способ, так как wp выполняет несколько проверок для получения всех ролей

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
2 окт. 2019 г. 15:19:58
1
if(current_user_can('administrator')){
   code... // код...
}
3 сент. 2021 г. 21:51:59
Комментарии

вероятно, это лучшая идея, но было бы неплохо расширить её на любого пользователя, а не только на текущего

Mark Kaplun Mark Kaplun
15 апр. 2022 г. 08:56:22
1

Вы также можете просто создать новый объект пользователя:

$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 была удалена, но она больше не доступна.

16 нояб. 2017 г. 02:44:06
Комментарии

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

Justin Waulters Justin Waulters
26 сент. 2019 г. 02:18:58
0

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

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

if(my_has_role($user, 'some_role')) {
  //выполнить действия
}
29 нояб. 2017 г. 01:05:00
0

Если на вашем сайте используется WooCommerce, вы можете просто использовать:

wc_current_user_has_role( $role );

Если нет, вы можете создать функцию самостоятельно, скопировав способ, которым это делает WooCommerce (комбинируя wc_current_user_has_role() и wc_user_has_role()):

/**
 * Проверяет, имеет ли текущий пользователь определенную роль.
 *
 * @param string $role Роль.
 * @return bool
 */
function mysite_current_user_has_role( $role ) {
    /** @var null|WP_User $user */
    $user = wp_get_current_user();

    if ( ! is_object( $user ) ) {
        $user = get_userdata( $user );
    }

    if ( ! $user || ! $user->exists() ) {
        return false;
    }

    return in_array( $role, $user->roles, true );
}
30 мая 2024 г. 17:15:24
0

Это старый пост, но вот универсальная функция, которая работает на всех версиях WordPress.

if(!function_exists('is_user')):
    function is_user ($role=NULL, $user_id=NULL)
    {
        if(empty($user_id)){
            $user = wp_get_current_user();
        } else {
            if(is_numeric($user_id) && $user_id == (int)$user_id) {
                $user = get_user_by('id', (int)$user_id);
            } else if(is_string($user_id) && $email = sanitize_email($user_id)) {
                $user = get_user_by('email', $email);
            } else {
                return false;
            }
        }
        
        if(!$user) return false;
        
        return in_array( $role, (array)$user->roles, true ) !== false;
    }
endif;

С помощью этой функции вы можете искать авторизованного пользователя по роли или по ID пользователя/email. Также принимает массив ролей пользователей.

27 июл. 2020 г. 09:42:06