Как проверить, находится ли пользователь в определенной роли?
У меня есть довольно специфическое требование показывать разный текст в метке поля на странице профиля пользователя в зависимости от роли текущего пользователя. Я никак не могу понять, как проверить, является ли текущий пользователь "автором".
Я ищу функцию типа:
is_user_in_role($user, "author");
Я полагаю, что это довольно просто, но я искал слишком долго без ответа, поэтому решил опубликовать вопрос здесь.

Если вам это нужно только для текущего пользователя, current_user_can()
принимает как роли, так и возможности.
ОБНОВЛЕНИЕ: Передача имени роли в current_user_can()
больше не гарантирует корректную работу (см. #22624). Вместо этого, возможно, вы захотите проверить роль пользователя:
$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
//Пользователь имеет роль "author"
}

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

Я искал способ получить роль пользователя, используя идентификатор пользователя. Вот что я придумал:
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 ) );
}

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

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

Вызов ролей на объекте пользователя $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;
}
}

Вы также можете просто создать новый объект пользователя:
$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
была удалена, но она больше не доступна.

Если на вашем сайте используется 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 );
}

Это старый пост, но вот универсальная функция, которая работает на всех версиях 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. Также принимает массив ролей пользователей.
