Функция current_user_can() в WordPress: как проверить права пользователя?

# Функция 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_plugins
  • edit_post
  • delete_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().

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *