Функция current_user_can()
в WordPress проверяет, имеет ли текущий пользователь определённые права (возможности). Она возвращает true
, если у пользователя есть указанное право, и false
— если нет.
- Проверка базового права:
- Проверка права редактирования конкретного поста по его ID:
- Пример работы с ролями (не рекомендуется):
- Мета-правa
- Пример использования с фильтрами и действиями
- Проверка прав на редактирование мета-полей
- Проверка прав для отдельного поста
- Проверка прав для новых ролей
- Проверка роли текущего пользователя без использования current_user_can()
- Права супер-администратора в мультисайте
- Заключение
Функция может использоваться с простыми и мета правами, которые связаны с конкретными объектами, такими как посты или пользователи. Если проверяется мета-право, для него можно передать идентификатор объекта, например, ID поста.
current_user_can( string $capability, mixed $args ): bool
Параметры:
$capability
(строка, обязательный): Имя права.$args
(смешанный, необязательный): Дополнительные параметры, которые могут потребоваться, например, ID объекта (поста, пользователя и т.д.).
Возвращает:
bool
:true
— если текущий пользователь имеет указанное право, иначеfalse
.
Проверка базового права:
if ( current_user_can( 'edit_posts' ) ) {
echo 'Текущий пользователь может редактировать посты.';
}
Проверка права редактирования конкретного поста по его ID:
if ( current_user_can( 'edit_post', $post_id ) ) {
echo 'Текущий пользователь может редактировать этот пост.';
}
Заметки:
- Если текущий пользователь является супер-администратором в мультисайт-сетях, функция почти всегда вернёт
true
(если только право не запрещено с использованием фильтраmap_meta_cap()
). - Функция может проверять как права, так и роли, но использование ролей вместо прав не рекомендуется, так как это может приводить к непредсказуемым результатам.
Пример работы с ролями (не рекомендуется):
if ( current_user_can( 'administrator' ) ) {
echo 'Текущий пользователь администратор.';
}
Почему не рекомендуется? Проверка ролей напрямую может привести к тому, что пользователи с более высокими привилегиями (например, супер-администратор) не пройдут проверку.
Роли в WordPress:^
Super Admin | Cупер-администратор. Имеет права для управления сетью сайтов. Эта роль появляется только при мультисайт установке. |
administrator | Aдминистратор сайта (отдельного сайта в сети мультисайт). |
editor | Редактор. Имеет доступ ко всем постам, страницам, комментариям, категориям, тегам и ссылкам. |
author | Автор. Может писать, загружать фотографии, редактировать и публиковать свои посты. |
contributor | Участник. Может писать посты, которые затем публикует редактор или админ. |
subscriber | Подписчик. Не может ничего, кроме редактирования профиля. |
Список прав по ролям
Список примитивных (фундаментальных) прав пользователя. Это возможности, которые по умолчанию есть у указанных ролей пользователей. Этот список прав задается единожды при установке WordPress и сохраняется в базе данных в опции wp_user_roles
, находящейся в таблице wp_options
.
Право | Super Admin | administrator | editor | author | contributor | subscriber |
---|---|---|---|---|---|---|
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 | да | да ¹ | — | — | — | — |
unfiltered_upload | да ³ | да ³ | — | — | — | — |
manage_network_options | да | — | — | — | — | — |
manage_network_plugins | да | — | — | — | — | — |
manage_network_themes | да | — | — | — | — | — |
manage_network_users | да | — | — | — | — | — |
manage_network | да | — | — | — | — | — |
manage_sites | да | — | — | — | — | — |
setup_network | да | — | — | — | — | — |
upgrade_network | да | — | — | — | — | — |
Примечания:
- Данное право доступно только на одном сайте (не мультисайте).
- Доступно на одном сайте (не мультисайте) или если включено в настройках сети.
- Право
unfiltered_upload
нужно включать отдельно.
Мета-правa
Мета-права (например, edit_post
) зависят от конкретных объектов, таких как посты, пользователи или таксономии. Когда вы проверяете мета-право, нужно передать идентификатор объекта.
Пример использования мета-прав:
if ( current_user_can( 'edit_post', $post_id ) ) {
echo 'Пользователь может редактировать этот пост.';
}
Пример работы с пользовательскими таксономиями:
if ( current_user_can( 'edit_term', $term_id ) ) {
echo 'Пользователь может редактировать элемент таксономии.';
}
Список мета-прав:
activate_plugin
activate_plugins
add_comment_meta
add_post_meta
add_term_meta
add_user_meta
add_users
assign_categories
assign_post_tags
assign_term
create_app_password
create_sites
create_users
customize
deactivate_plugin
deactivate_plugins
delete_app_password
delete_app_passwords
delete_categories
delete_comment_meta
delete_page
delete_plugins
delete_post
delete_post_meta
delete_post_tags
delete_site
delete_sites
delete_term
delete_term_meta
delete_themes
delete_user
delete_user_meta
delete_users
edit_app_password
edit_categories
edit_comment
edit_comment_meta
edit_css
edit_files
edit_page
edit_plugins
edit_post
edit_post_meta
edit_post_tags
edit_term
edit_term_meta
edit_themes
edit_user
edit_user_meta
edit_users
erase_others_personal_data
export_others_personal_data
install_languages
install_plugins
install_themes
list_app_passwords
manage_links
manage_network
manage_network_options
manage_network_plugins
manage_network_themes
manage_network_users
manage_post_tags
manage_privacy_options
manage_sites
promote_user
publish_post
read_app_password
read_page
read_post
remove_user
resume_plugin
resume_theme
setup_network
unfiltered_html
unfiltered_upload
update_core
update_https
update_languages
update_php
update_plugins
update_themes
upgrade_network
upload_plugins
upload_themes
edit_term — WP 4.7 — Не проверят кто создал термин - только проверяет наличие указанного термина и таксономии.
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 )
Пример использования с фильтрами и действиями
Скрыть панель администратора для пользователей, которые не являются администраторами
Обычно, если пользователь не имеет административных прав, лучше скрыть панель администрирования. Это можно сделать с помощью фильтра show_admin_bar
и проверки с использованием current_user_can()
:
if ( ! current_user_can( 'manage_options' ) ) {
add_filter( 'show_admin_bar', '__return_false' );
}
Этот код отключит панель администратора для всех пользователей, кроме тех, у кого есть права manage_options
(администраторов).
Проверка прав на редактирование мета-полей
Когда вам нужно проверить, может ли пользователь редактировать мета-поля для определенного поста, вы можете передать ID поста и ключ мета-поля в функцию current_user_can()
:
if ( current_user_can( 'edit_post_meta', $post->ID, $meta_key ) ) {
// Пользователь может редактировать указанное мета-поле.
}
Эта проверка полезна, когда у вас есть специфические мета-поля, которые могут редактироваться только определенными пользователями.
Проверка прав для отдельного поста
Часто нужно проверять права на выполнение действия по отношению к конкретному объекту, например посту или странице. В этом случае можно использовать второй аргумент функции:
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return false;
}
Этот код проверяет, может ли текущий пользователь редактировать пост с указанным ID. Если нет, код возвращает false
.
Проверка прав для новых ролей
Иногда в системе могут быть добавлены пользовательские роли, и нужно проверять их права. Пример с пользовательской ролью custom_role
:
if ( current_user_can( 'custom_role' ) ) {
// Действия для пользователей с ролью custom_role.
}
Проверка роли текущего пользователя без использования current_user_can()
Можно также использовать проверку ролей через объект WP_User
и метод wp_get_current_user()
для получения ролей пользователя:
$user = wp_get_current_user();
$allowed_roles = array( 'editor', 'administrator' );
if ( array_intersect( $allowed_roles, $user->roles ) ) {
// Пользователь имеет одну из указанных ролей.
}
Этот код проверяет, принадлежит ли текущий пользователь одной из указанных ролей.
Права супер-администратора в мультисайте
В сетевых установках WordPress (Multisite) супер-администраторы всегда имеют все права по умолчанию, если они явно не запрещены:
if ( current_user_can( 'manage_network' ) ) {
// Действия для супер-администраторов сети.
}
Чтобы явным образом запретить действие супер-администраторам, нужно использовать фильтр map_meta_cap()
:
add_filter( 'map_meta_cap', 'deny_super_admin_capability', 10, 4 );
function deny_super_admin_capability( $caps, $cap, $user_id, $args ) {
if ( is_super_admin( $user_id ) && $cap === 'specific_capability' ) {
$caps[] = 'do_not_allow';
}
return $caps;
}
Этот код запрещает супер-администратору выполнять определенное действие, заменяя его право на do_not_allow
.
Заключение
Функция current_user_can()
является важным инструментом для проверки прав пользователей в WordPress. Она предоставляет гибкость для проверки как примитивных, так и мета-прав, а также динамических прав, которые могут изменяться в зависимости от условий.