# Функция current_user_can() в WordPress
Функция current_user_can() проверяет, есть ли у текущего пользователя определённые права или возможности.
---
## Как это работает
По умолчанию в WordPress данные о текущем пользователе устанавливаются в ходе выполнения действия init. Поэтому рекомендуется использовать эту функцию не раньше, чем после этого события. Но обычно она также корректно работает и после события plugins_loaded.
Для суперадминистраторов в многосайтной сети всегда доступны все возможности (возвращается true), если только возможность не ограничена явно. Таким образом, единственный способ запретить конкретную возможность для суперадминистраторов — использовать фильтр map_meta_cap, возвращая do_not_allow.
Чтобы проверить возможности конкретного пользователя, следует использовать функцию user_can().
---
### Возвращаемое значение
Функция возвращает true или false. Если $capability — это метаправа и передан $object_id, то функция проверяет, есть ли у текущего пользователя необходимое метаправо для данного объекта.
---
## Содержание
- [Использование](#использование)
- [Основной список возможностей](#основной-список-возможностей)
- [Список возможностей по ролям](#список-возможностей-по-ролям)
- [Метаправа](#метаправа)
- [Динамические права](#динамические-права)
- [unfiltered_upload](#unfiltered_upload)
- [Примеры](#примеры)
---
## Использование
```php
current_user_can( $capability, ...$args );
$capability(строка) (обязательный параметр) — название возможности. Список возможностей можно найти в документации.$object_id(целое число) (обязательный параметр) — ID конкретного объекта, если$capabilityявляется "метаправом".
Метаправа, такие как 'edit_post' или 'edit_user', используются для установки mapping'а на другие "примитивные" права, например, 'edit_posts'.
Основной список возможностей
В WordPress по умолчанию есть 6 ролей:
- Суперадминистратор: имеет права управлять сетевыми сайтами.
- Администратор: администратор отдельного сайта в сети.
- Редактор: имеет доступ ко всем записям, страницам, комментариям и категориям.
- Автор: может создавать, загружать фото и публиковать свои записи.
- Участник: может создавать записи, которые затем публикуются редактором или администратором.
- Подписчик: не может делать ничего, кроме редактирования профиля.
Роль, которую получит новый пользователь, указывается в настройках.
Список возможностей по ролям
Ниже представлен список основных возможностей для каждой роли:
| Возможность | Суперадмин | Администратор | Редактор | Автор | Участник | Подписчик |
|---|---|---|---|---|---|---|
| читать | да | да | да | да | да | да |
| удалять записи | да | да | да | да | да | нет |
| редактировать записи | да | да | да | да | нет | нет |
| публиковать записи | да | да | да | да | нет | нет |
| загружать файлы | да | да | да | да | нет | нет |
| администрировать категории | да | да | да | нет | нет | нет |
| управлять плагинами | да | да | нет | нет | нет | нет |
Метаправа
Метаправа не хранятся, они вычисляются "на лету". Примеры метаправ:
activate_pluginsedit_postdelete_post
Чтобы проверить такие права, нужно передать дополнительные параметры, например, ID записи, для которой нужно проверить возможность редактирования.
Пример проверки:
if( current_user_can( 'edit_post', 123 ) ){
echo 'Текущий пользователь может редактировать запись 123';
}
Динамические права
Это права, которые не сохраняются в базе данных, но вычисляются на основе условий. Вычисления происходят в хукe user_has_cap.
Примеры динамических прав:
install_languages— связанные с установкой языков и плагинов.view_site_health_checks— обозрение состояния сайта.
unfiltered_upload
По умолчанию право unfiltered_upload доступно администратору, но по умолчанию оно заблокировано. Чтобы разрешить его, добавьте в файл wp-config.php следующий код:
define( 'ALLOW_UNFILTERED_UPLOADS', true );
С этим определением пользователи с правом unfiltered_upload смогут загружать файлы с любыми расширениями.
Примеры
1. Проверка, является ли пользователь администратором:
if( current_user_can( 'manage_options') ){
echo 'У пользователя есть права для изменения настроек - это администратор';
}
2. Использование user_can() для проверки прав текущего пользователя:
global $user;
if( user_can( $user->ID, 'manage_options' ) ){
// Выполните действие, доступное для пользователя с этими правами
}
3. Проверка прав для конкретного элемента таксономии:
if( current_user_can( 'edit_term', $term_id ) ){
echo 'Редактировать.';
}
4. Проверка нескольких ролей:
$user = wp_get_current_user();
$allowed_roles = [ 'editor', 'administrator', 'author' ];
if ( array_intersect( $allowed_roles, $user->roles ) ) {
// Действия для разрешённых ролей
}
Примечания
Для детального изучения работы этих возможностей вы можете ознакомиться с функциями WP_User::has_cap() и map_meta_cap().
Изменения
- С 2.0.0 — Введение функции.
- С 5.3.0 — Формализован существующий параметр
...$args. - С 5.8.0 — Функция стала оберткой для
user_can().