current_user_can() WP 2.0
Проверяет права текущего пользователя, совершать указанное действие.
Функцию можно использовать начиная с события plugins_loaded . По умолчанию в WP текущий юзер устанавливается на событии init.
Когда нужно проверить право указанного, а не текущего пользователя, используйте user_can().
- Использование
- Базовый список прав
- Мета права
- Примеры
- #1. Проверим администратор пользователь или нет:
- #2. Используем user_can(), чтобы проверить права текущего пользователя:
- #3. Пример использования второго аргумента $args:
- #4. Проверка прав для отдельного элемента таксономии
- Проверка роли текущего пользователя
- #1 Функция проверки роли
- #2 Еще одна функцию проверки ролей текущего пользователя
Хуков нет.
Возвращает
true/false. true — есть права, false — нет прав.
Использование
if( current_user_can( $capability, $args ) ){ // есть право... }
- $capability(строка) (обязательный)
- Название возможности или роли. Список возможностей и ролей смотрите здесь.
По умолчанию: нет - $args(смешанный)
- Дополнительные аргументы, которые могут понадобиться, например, ID поста. Некоторые проверки возможностей нуждаются в таких аргументах (например, 'edit_post' или 'delete_page').
По умолчанию: нет
Базовый список прав
Список примитивных (фундаментальных) прав пользователя. Это возможности которые по умолчанию есть у указанных ролей (пользователей). Этот список прав задается единожды, при установке 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'
Для проверки таких прав нужно передавать дополнительные параметры, например 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';
Заметки
- Смотрите: WP_User::has_cap()
- Смотрите: map_meta_cap()
Список изменений
С версии 2.0.0 | Введена. |
С версии 5.3.0 | Formalized the existing and already documented ...$args parameter by adding it to the function signature. |
Код current_user_can() current user can WP 5.6.2
function current_user_can( $capability, ...$args ) {
$current_user = wp_get_current_user();
if ( empty( $current_user ) ) {
return false;
}
return $current_user->has_cap( $capability, ...$args );
}