WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Получай пассивный доход от сайта

current_user_can() WP 2.0

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

Функцию можно использовать начиная с события plugins_loaded . По умолчанию в WP текущий юзер устанавливается на событии init.

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

Работает на основе: WP_User::has_cap()
Основа для: get_edit_post_link()
1 раз — 0.0034041 сек (очень медленно) | 50000 раз — 3.84 сек (быстро) | PHP 7.4.8, WP 5.6

Хуков нет.

Возвращает

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

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

if( current_user_can( $capability, $args ) ){
	// есть право...
}
$capability(строка) (обязательный)
Название возможности или роли. Список возможностей и ролей смотрите здесь.
...$args(смешанный)

Дополнительные аргументы, которые будут использованы для проверки права. Например, ID поста.

Некоторые проверки нуждаются в таких аргументах. Например, edit_post нужно указать ID записи для которой выполняется проверка доступа.

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

По умолчанию в WordPress 6 ролей:

Super Admin Cупер-администратор. Имеет права для управления сетью сайтов. Эта роль появляется только при мультисайт установке.
administrator Aдминистратор сайта (отдельного сайта в сети мультисайт).
editor Редактор. Имеет доступ ко всем постам, страницам, комментариям, категориям, тегам и ссылкам.
author Автор. Может писать, загружать фотографии, редактировать и публиковать свои посты.
contributor Участник. Может писать посты, которые затем публикует редактор или админ.
subscriber Подписчик. Не может ничего, кроме редактирования профиля.

Какую роль получает новый пользователь указывается в Настройки > Общие. Данные сохраняются в опции: users_can_register и default_role:

меню

Список прав по ролям

Список примитивных (фундаментальных) прав пользователя. Это возможности которые по умолчанию есть у указанных ролей (пользователей). Этот список прав задается единожды, при установке WordPress - он сохраняется в таблицу БД wp_options в опцию wp_user_roles.

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

Мета права

Выше перечислен список примитивных (фундаментальных) прав. Но есть еще так называемые мета-права. Они нигде не сохраняются, а вычисляются «налету» и в итоге превращаются в примитивное право.

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

delete_user
edit_user
remove_user
promote_user
delete_post
delete_page
edit_post
edit_page
edit_comment
read_post
read_page

edit_term                   — WP 4.7 — Нет привязки к юзеру, который создавал термин.
									   Право мало чем отличается от `edit_terms`.
									   Оно только проверяет наличие указанного термина и его таксономии.
delete_term                 — WP 4.7 —
assign_term                 — WP 4.7 —
activate_plugin             — WP 4.9 — current_user_can( 'activate_plugin', 'my-plugin/my-plugin.php' )
deactivate_plugin           — WP 4.9 — current_user_can( 'deactivate_plugin', 'my-plugin/my-plugin.php' )

export_others_personal_data — WP 4.9.6 — is_multisite() ? 'manage_network' : 'manage_options'
erase_others_personal_data  — WP 4.9.6 — is_multisite() ? 'manage_network' : 'manage_options'
manage_privacy_options      — WP 4.9.6 — is_multisite() ? 'manage_network' : 'manage_options'

update_php                  — WP 5.0 — is_multisite() ? is_super_admin() : update_core
update_https                — WP 5.7 — is_multisite() ? is_super_admin() : manage_options | update_core

create_app_password         — WP 5.7 — map_meta_cap( 'edit_user', $user_id )
list_app_passwords          — WP 5.7 — map_meta_cap( 'edit_user', $user_id )
read_app_password           — WP 5.7 — map_meta_cap( 'edit_user', $user_id )
edit_app_password           — WP 5.7 — map_meta_cap( 'edit_user', $user_id )
delete_app_passwords        — WP 5.7 — map_meta_cap( 'edit_user', $user_id )
delete_app_password         — WP 5.7 — map_meta_cap( 'edit_user', $user_id )

Для проверки таких прав нужно передавать дополнительные параметры, например ID записи для которой нужно проверить может ли пользователь её редактировать. Например:

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

В этом, случае WP налету проверяет является ли пользователь автором этого поста, или у него есть примитивное право редактировать все посты. В результате, если проверка пройдена, это мета право превращается в аналогичное примитивное право, которое разрешает выполнять действие.

Подробнее о мета правах читайте в описании 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 href="'. 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';

Заметки

Список изменений

С версии 2.0.0 Введена.
С версии 5.3.0 Formalized the existing and already documented ...$args parameter by adding it to the function signature.
С версии 5.8.0 Converted to wrapper for the user_can() function.

Код current_user_can() WP 5.8

<?php
function current_user_can( $capability, ...$args ) {
	return user_can( wp_get_current_user(), $capability, ...$args );
}

Из метки: Безопасность

Еще из метки: Роли и возможности (role capabilities)

Еще из метки: Пользователи (_user)

12 комментов
Полезные 3 Все
    Войти