Добавление прав пользователей "на лету"
В WordPress обычно права ролей назначаются во время их регистрации. Дополнительные права для отдельных пользователей можно добавить с помощью плагина User Role Editor. Однако, иногда удобнее назначать права динамически, не внося изменения в базу данных. Это может быть полезно на проектах, где права постоянно добавляются или убираются.
В этой статье мы рассмотрим, как добавить права "на лету" с помощью хука user_has_cap
. Это позволяет изменять права пользователей в коде и видеть результаты сразу.
Простое добавление права
Давайте рассмотрим простой пример, в котором мы добавляем право some_capability
пользователю с ID 5:
add_filter( 'user_has_cap', 'maybe_grant_some_capability_cap', 1, 4 );
function maybe_grant_some_capability_cap( $allcaps, $caps, $args, $user ) {
if ( 5 === (int) $user->ID ) {
$allcaps['some_capability'] = true;
}
return $allcaps;
}
В этом примере мы используем хук user_has_cap
, чтобы добавить новое право для пользователя с ID 5.
Более сложный пример
Теперь рассмотрим более сложный пример, который проверяет роль текущего пользователя и добавляет новые права в зависимости от этой роли. Название роли хранится в общем списке прав пользователя.
add_filter( 'user_has_cap', 'kama_user_has_cap', 10, 4 );
/**
* Изменяет права ролей "на лету".
*
* @param array $allcaps Все права пользователя.
* @param array $caps Права, которые проверяются.
* @param array $args Дополнительные аргументы.
* @param WP_User $user Объект пользователя.
*
* @return array Обновленный массив прав.
*/
function kama_user_has_cap( $allcaps, $caps, $args, $user ) {
// Роль трекера (неконфирмированная)
$role = 'project_tracker_fake';
if ( ! empty( $allcaps[ $role ] ) ) {
$allcaps['read'] = true; // Право читать
}
// Роль лидера проекта
$role = 'project_leader';
if ( ! empty( $allcaps[ $role ] ) ) {
$allcaps['read'] = true; // Право читать
$allcaps['edit_posts'] = true; // Право редактировать записи
$allcaps['edit_published_posts'] = true; // Право редактировать опубликованные записи
// Дополнительные права
$allcaps['view_expert_note'] = true; // Смотреть экспертную заметку
$allcaps['view_expert_comment'] = true; // Смотреть комментарий эксперта
$allcaps['view_moderator_note'] = true; // Смотреть заметку модератора
}
// Роль трекера проекта
$role = 'project_tracker';
if ( ! empty( $allcaps[ $role ] ) ) {
$allcaps['read'] = true; // Право читать
$allcaps['edit_posts'] = true; // Право редактировать записи
$allcaps['edit_published_posts'] = true; // Право редактировать опубликованные записи
$allcaps['view_post_contacts'] = true; // Смотреть контакты
// Дополнительные права
$allcaps['view_expert_note'] = true; // Смотреть экспертную заметку
$allcaps['view_expert_comment'] = true; // Смотреть комментарий эксперта
$allcaps['view_expert_rating'] = true; // Смотреть рейтинг эксперта
$allcaps['view_moderator_note'] = true; // Смотреть заметку модератора
}
// Роль эксперта
$role = 'project_expert';
if ( ! empty( $allcaps[ $role ] ) ) {
$allcaps['read'] = true; // Право читать
$allcaps['edit_posts'] = true; // Право редактировать записи
$allcaps['delete_others_posts'] = false; // Нет права удалять записи других пользователей
$allcaps['edit_others_posts'] = true; // Право редактировать записи других пользователей
$allcaps['view_post_contacts'] = true; // Смотреть контакты
// Дополнительные права
$allcaps['view_moderator_note'] = true; // Смотреть заметку модератора
$allcaps['view_expert_note'] = true; // Смотреть экспертную заметку
$allcaps['view_expert_comment'] = true; // Смотреть комментарий эксперта
$allcaps['view_expert_rating'] = true; // Смотреть рейтинг эксперта
$allcaps['add_expert_note'] = true; // Редактировать экспертную заметку
$allcaps['add_expert_comment'] = true; // Редактировать комментарий эксперта
$allcaps['add_expert_rating'] = true; // Редактировать рейтинг эксперта
}
return $allcaps;
}
В этом примере мы проверяем роль пользователя и добавляем соответствующие права в зависимости от этой роли.
Проверка прав пользователя
Теперь вы можете проверить, есть ли у пользователя право add_expert_rating
, следующим образом:
if( current_user_can( 'add_expert_rating' ) ){
echo 'Право доступно.';
}
Этот код проверяет, имеет ли текущий пользователь право на добавление рейтинга эксперта, и выводит сообщение, если право есть.
Заключение
Используя хук user_has_cap
, вы можете динамически изменять права пользователей в вашем проекте на WordPress. Это особенно полезно для проектов с быстро меняющимися потребностями в управлении правами.