В современной тикет-системе важна гибкая и надежная система разрешений, чтобы разграничить права доступа между разными группами пользователей. В этой статье мы разберем, как создать двухуровневую систему разрешений в WordPress, где, например, обычные сотрудники смогут только просматривать и комментировать тикеты, а администраторы — создавать, редактировать и закрывать их.
Почему стандартных ролей WordPress недостаточно для тикет-системы
По умолчанию WordPress предлагает ряд ролей — администратор, редактор, автор, подписчик и т.д. Но в большинстве случаев они не подходят для специфических задач тикет-системы, где необходимо четко разграничить доступ к отдельным действиям над тикетами. Поэтому важно создать кастомные роли и права, ориентированные именно на работу с тикетами.
Например, обычный пользователь должен иметь возможность создавать тикеты и отвечать на них, но не закрывать или удалять их. Администратор же должен иметь полный контроль, включая изменение статусов и удаление тикетов.
Создание кастомных ролей и прав доступа в WordPress для тикетов
Для начала создадим две кастомные роли: wpticket_agent — для сотрудников, и wpticket_manager — для руководителей. Каждая роль получит свои права.
function wpticket_register_custom_roles() {
add_role('wpticket_agent', 'Агент тикетов', [
'read' => true,
'edit_tickets' => true,
'read_tickets' => true,
'comment_tickets' => true
]);
add_role('wpticket_manager', 'Менеджер тикетов', [
'read' => true,
'edit_tickets' => true,
'read_tickets' => true,
'comment_tickets' => true,
'close_tickets' => true,
'delete_tickets' => true
]);
}
add_action('init', 'wpticket_register_custom_roles');Здесь мы создаем роли с простыми кастомными правами. Но WordPress не понимает их по умолчанию, поэтому нужно дополнительно реализовать проверку в коде.
Реализация проверки прав на уровне функционала тикет-системы
В функции, которая отвечает за изменение статуса тикета, нужно проверять, есть ли у текущего пользователя соответствующее право:
function wpticket_can_user_close_ticket($user_id) {
$user = get_userdata($user_id);
return in_array('wpticket_manager', $user->roles);
}
function wpticket_close_ticket($ticket_id, $user_id) {
if (!wpticket_can_user_close_ticket($user_id)) {
wp_die('У вас нет прав закрывать тикеты.');
}
// логика закрытия тикета
wp_update_post([
'ID' => $ticket_id,
'post_status' => 'closed'
]);
}Таким образом мы защищаем ключевые операции от пользователей с недостаточными правами.
Использование плагинов для управления ролями и правами
Чтобы упростить создание и управление ролями, можно использовать плагины, например Clearfy Pro. В нем есть удобный интерфейс для создания кастомных ролей и назначения прав.
Еще один полезный плагин — Expert Review, который поможет создавать расширенные настройки доступа и проверять права на уровне отдельных элементов интерфейса.
Пример расширения REST API для проверки прав в тикет-системе
Если тикеты обрабатываются через REST API, нужно корректно проверять права в эндпоинтах. Пример регистрации маршрута с проверкой кастомного права:
add_action('rest_api_init', function () {
register_rest_route('wpticket/v1', '/close/(?P<id>\d+)', [
'methods' => 'POST',
'callback' => 'wpticket_close_ticket_rest',
'permission_callback' => function () {
return current_user_can('close_tickets');
},
]);
});
function wpticket_close_ticket_rest($request) {
$ticket_id = $request['id'];
$result = wpticket_close_ticket($ticket_id, get_current_user_id());
if (is_wp_error($result)) {
return $result;
}
return ['success' => true];
}Таким образом REST API будет защищен от неавторизованных действий.
Выводы и рекомендации
Двухуровневая система разрешений помогает четко разграничить функции и повысить безопасность тикет-системы. Важно создавать кастомные роли и права, проверять их в коде и при необходимости использовать плагины для удобства управления.
Рекомендуется также проводить ревизию прав и тестировать все сценарии, чтобы избежать ошибок доступа.
Для расширения функционала и удобства администрирования советую рассмотреть плагины Clearfy Pro и Expert Review. Их возможности помогут быстро расширить и упростить управление ролями и правами в вашей тикет-системе.