current_user_can

Проверяет права пользователя, совершать то или иное действие (указывается).

Когда нужно проверить право указанного, а не текущего пользователя, используйте user_can().
Оглавление ▴


  • Использование


  • Параметры


  • Базовый список прав


  • Мета права


  • Примеры


  • #1. Проверим администратор пользователь или нет:


  • #2. Используем user_can(), чтобы проверить права текущего пользователя:


  • #3. Пример использования второго аргумента $args:


  • #4. Проверка прав для отдельного элемента таксономии


  • Проверка роли текущего пользователя


  • #1 Функция проверки роли


  • #2 Еще одна функцию проверки ролей текущего пользователя

✈ 1 раз = 0.000049с = очень быстро | 50000 раз = 0.62с = очень быстро PHP 7.0.5, WP 4.5.2

Хуков нет.

Возвращает

true — есть права, false — нет прав.

Использование

if( current_user_can( $capability, $args ) ){
	// есть право...    
}


Параметры

$capability(строка) (обязательный)
Название возможности или роли. Список возможностей и ролей смотрите здесь.
По умолчанию: нет
$args(смешанный)
Дополнительные аргументы, которые могут понадобится, например, ID поста. Некоторые проверки возможностей нуждаются в таких аргументах (например, ‘edit_post’ или ‘delete_page’).
По умолчанию: нет

Базовый список прав

Право Супер Админ Админ Редактор Автор Участник Подписчик
manage_network да
manage_sites да
manage_network_users да
manage_network_plugins да
manage_network_themes да
manage_network_options да
unfiltered_html да
Право Супер Админ Админ Редактор Автор Участник Подписчик
activate_plugins да да (один сайт или включается в настройках сети)
create_users да да (один сайт)
delete_plugins да да (один сайт)
delete_themes да да (один сайт)
delete_users да да (один сайт)
edit_files да да (один сайт)
edit_plugins да да (один сайт)
edit_theme_options да да
edit_themes да да (один сайт)
edit_users да да (один сайт)
export да да
import да да
Право Супер Админ Админ Редактор Автор Участник Подписчик
install_plugins да да (один сайт)
install_themes да да (один сайт)
list_users да да
manage_options да да
promote_users да да
remove_users да да
switch_themes да да
update_core да да (один сайт)
update_plugins да да (один сайт)
update_themes да да (один сайт)
edit_dashboard да да
Право Супер Админ Админ Редактор Автор Участник Подписчик
moderate_comments да да да
manage_categories да да да
manage_links да да да
edit_others_posts да да да
edit_pages да да да
edit_others_pages да да да
edit_published_pages да да да
publish_pages да да да
delete_pages да да да
delete_others_pages да да да
delete_published_pages да да да
delete_others_posts да да да
delete_private_posts да да да
edit_private_posts да да да
read_private_posts да да да
delete_private_pages да да да
edit_private_pages да да да
read_private_pages да да да
Право Супер Админ Админ Редактор Автор Участник Подписчик
edit_published_posts да да да да
upload_files да да да да
publish_posts да да да да
delete_published_posts да да да да
edit_posts да да да да да
delete_posts да да да да да
read да да да да да да
Право Супер Админ Админ Редактор Автор Участник Подписчик

Подробнее на официальной странице

к началу

Мета права

Выше перечислен список фундаментальных прав. Но есть еще так называемые мета-права. Им указывается дополнительные параметры (например право редактирование конкретной записи). Для таких прав WP делает дополнительную проверку, чтобы узнать может ли пользователь совершать действие. Например:

if( current_user_can('edit_post', 123) ) {
	 echo 'Текущий пользователь может редактировать пост 123'.
}

Список мета-прав:

  • delete_user
  • edit_user
  • remove_user
  • promote_user
  • delete_post
  • delete_page
  • edit_post
  • edit_page
  • read_post
  • read_page
  • edit_term (с WP 4.7)
  • delete_term (с WP 4.7)
  • assign_term (с WP 4.7)

Подробнее о мета правах читайте в описании map_meta_cap()

к началу

Примеры

#1. Проверим администратор пользователь или нет:

// проверим возможность
if( current_user_can('manage_options') ){
	echo "У пользователя есть права изменять настройки";
}


#2. Используем user_can(), чтобы проверить права текущего пользователя:

// определяем пользователя глобально
global $user;
if( user_can($user->ID, 'manage_options') ){
	// делаем что-то что может пользователь с этими правами
};

manage_options – права администратора

#3. Пример использования второго аргумента $args:

if( current_user_can('edit_post', 123) ) {
	 echo 'Текущий пользователь может редактировать пост 123'.
}


#4. Проверка прав для отдельного элемента таксономии

C версии 4.7. Стало возможным проверять права для отдельного термина. Для этого нужно использовать права: edit_term, delete_term, assign_term.

Например, давайте выведем ссылку на редактирование элемента таксономии, только если текущий текущий пользователь имеет такое право.

if( current_user_can('edit_term', $term_id) ){
	echo '<a . get_edit_term_link( $term_id ) .'">Редакт.</a>';
}


Проверка роли текущего пользователя

Не используйте название роли в current_user_can(), потому что проверка может работать неправильно. Пример, как делать не следует:

// если текущий пользователь редактор (editor), то функция вернет:
current_user_can('administrator') // false
current_user_can('editor') // true
current_user_can('contributor') // false
current_user_can('subscriber') // false


#1 Функция проверки роли

Вместо этого вы можете воспользоваться функцией проверки роли текущего пользователя:

/**
 * Проверяет роль определенного пользователя. 
 * Возвращает true при совпадении.
 *
 * @param строка $role Название роли.
 * @param логический $user_id (не обязательный) ID пользователя, роль которого нужно проверить.
 * @return bool
 */
function is_user_role( $role, $user_id = null ) {
	$user = is_numeric( $user_id ) ? get_userdata( $user_id ) : wp_get_current_user();

	if( ! $user )
		return false;

	return in_array( $role, (array) $user->roles );
}

// Пример использования для текущего пользователя
if( is_user_role( 'customer' ) )
	echo "есть доступ";
else
	echo "нет доступа";

// Пример использования для определенного пользователя
$user_id = 23;

if ( is_user_role( 'customer', $user_id ) )
	echo "У вас есть доступ";
else
	echo "У вас нет доступа";


к началу

#2 Еще одна функцию проверки ролей текущего пользователя

Эту функцию я написал в процессе работы над одним из проектов, теперь её периодически использую.

## Проверяет есть указанная роль в ролях текущего/указанного пользователя
## $roles строка/массив - название роли которую нужно проверить у текущего пользователя
function is_user_role_in( $roles, $user = false ){
	if( ! $user )           $user = wp_get_current_user();
	if( is_numeric($user) ) $user = get_userdata( $user );

	if( empty($user->ID) )
		return false;

	foreach( (array) $roles as $role )
		if( isset($user->caps[ $role ]) || in_array($role, $user->roles) )
			return true;

	return false;
}

// Пример использования
if( is_user_role_in(['new_role','new_role2']) )
	echo 'Роль текущего пользователя new_role или new_role2';

if( is_user_role_in(['new_role','new_role2'], 5) )
	echo 'Роль пользователя 5 new_role или new_role2';

Код из


wp-includes/capabilities.php

WP 4.7.2

<?php
function current_user_can( $capability ) {
	$current_user = wp_get_current_user();

	if ( empty( $current_user ) )
		return false;

	$args = array_slice( func_get_args(), 1 );
	$args = array_merge( array( $capability ), $args );

	return call_user_func_array( array( $current_user, 'has_cap' ), $args );
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *