В современных сервисных порталах и сайтах поддержки клиентов часто возникает задача делать тикеты (заявки, обращения) привязанными к конкретным пользователям. Это позволяет не только хранить историю обращений, но и управлять доступом, уведомлениями и статусами. В этой статье подробно рассмотрим, как реализовать такую систему в WordPress с помощью собственного кода и плагинов.
Почему важна привязка тикетов к пользователям
Без привязки тикетов к пользователям система поддержки превращается в хаос: заявки можно легко перепутать, сложно фильтровать их по владельцам, а клиентам неудобно видеть свои обращения.
Привязка позволяет:
- Отображать клиенту только его тикеты в личном кабинете.
- Отправлять уведомления именно тому пользователю, который создал тикет.
- Управлять правами доступа — кто может смотреть, редактировать или закрывать тикет.
- Анализировать статистику по обращениям пользователей.
В WordPress это достигается за счет использования Custom Post Type и пользовательских полей, а также связей с пользователями.
Создание кастомного типа записи "Тикет" с привязкой к пользователям
Первым шагом создадим тип записи для тикетов и добавим мета-поле для хранения ID пользователя, который создал тикет.
Регистрируем тип записи
function wpticket_register_ticket_post_type() {
$labels = array(
'name' => 'Тикеты',
'singular_name' => 'Тикет',
'menu_name' => 'Тикеты',
'name_admin_bar' => 'Тикет',
'add_new' => 'Добавить новый',
'add_new_item' => 'Добавить новый тикет',
'edit_item' => 'Редактировать тикет',
'new_item' => 'Новый тикет',
'view_item' => 'Посмотреть тикет',
'search_items' => 'Поиск тикетов',
'not_found' => 'Тикеты не найдены',
'not_found_in_trash' => 'В корзине тикеты не найдены'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'supports' => array('title', 'editor', 'author', 'custom-fields'),
'capability_type' => 'post',
'menu_position' => 5,
'menu_icon' => 'dashicons-tickets-alt'
);
register_post_type('wpticket_ticket', $args);
}
add_action('init', 'wpticket_register_ticket_post_type');
Данный код создаст новый тип записи с названием "Тикеты". Важно, что мы используем поддержку 'author', чтобы автоматически привязывать тикет к пользователю, который его создал.
Привязываем тикет к пользователю автоматически при создании
Чтобы гарантировать, что тикет будет связан с текущим пользователем, добавим следующий код:
function wpticket_set_ticket_author($post_id, $post, $update) {
if ($post->post_type !== 'wpticket_ticket') {
return;
}
if ($update) {
return; // Только при создании
}
$current_user = wp_get_current_user();
if ($current_user->ID) {
// Обновляем автора тикета
remove_action('save_post', 'wpticket_set_ticket_author', 10);
wp_update_post(array(
'ID' => $post_id,
'post_author' => $current_user->ID
));
add_action('save_post', 'wpticket_set_ticket_author', 10, 3);
}
}
add_action('save_post', 'wpticket_set_ticket_author', 10, 3);
Теперь при создании тикета он автоматически будет связан с авторизованным пользователем. Это базовый способ, который можно расширить.
Отображение тикетов пользователя в личном кабинете
Для удобства клиентов стоит сделать страницу, где пользователь будет видеть только свои тикеты. Это можно сделать с помощью WP_Query с фильтром по автору.
Пример кода для вывода тикетов пользователя
function wpticket_show_user_tickets() {
if (!is_user_logged_in()) {
return '<p>Пожалуйста, войдите, чтобы просмотреть свои тикеты.</p>';
}
$current_user_id = get_current_user_id();
$args = array(
'post_type' => 'wpticket_ticket',
'author' => $current_user_id,
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC'
);
$query = new WP_Query($args);
if (!$query->have_posts()) {
return '<p>Тикетов пока нет.</p>';
}
$output = '<ul class="wpticket-user-tickets">';
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a> – ' . get_the_date() . '</li>';
}
$output .= '</ul>';
wp_reset_postdata();
return $output;
}
add_shortcode('wpticket_user_tickets', 'wpticket_show_user_tickets');
Этот шорткод [wpticket_user_tickets] можно вставить в любую страницу для отображения списка тикетов текущего пользователя.
Управление доступом и ролями
Чтобы обеспечить безопасность, нужно ограничить, кто может видеть и редактировать тикеты. Например, клиенты должны видеть только свои тикеты, а администраторы и поддержка — все.
Пример ограничения доступа к тикетам
Добавим фильтр, который не позволит пользователям видеть чужие тикеты в админке:
function wpticket_filter_tickets_by_author($query) {
global $pagenow;
if (!is_admin() || $pagenow !== 'edit.php' || !isset($query->query['post_type']) || $query->query['post_type'] !== 'wpticket_ticket') {
return;
}
if (!current_user_can('manage_options')) { // Админы видят все
$query->set('author', get_current_user_id());
}
}
add_action('pre_get_posts', 'wpticket_filter_tickets_by_author');
Так пользователи без прав администратора увидят только свои тикеты в админке.
Использование плагинов для расширения функционала тикетов
Если хотите ускорить разработку или получить дополнительные возможности, можно рассмотреть плагины:
- Expert Review — для организации отзывов и тикетов, с удобным интерфейсом и кастомизацией.
- WPRemark — система комментариев и тикетов с расширенными настройками прав и уведомлений.
Эти плагины позволяют быстро создать полноценную систему тикетов с привязкой к пользователям и мощными инструментами управления.
Автоматизация уведомлений о новых тикетах пользователям
Для улучшения клиентского опыта важно отправлять уведомления пользователям при создании или обновлении тикетов.
Пример отправки email уведомления при создании тикета
function wpticket_send_notification_on_new_ticket($post_id, $post, $update) {
if ($post->post_type !== 'wpticket_ticket' || $update) {
return;
}
$user = get_userdata($post->post_author);
if (!$user) {
return;
}
$to = $user->user_email;
$subject = 'Новый тикет создан';
$message = 'Здравствуйте, ' . $user->display_name . "!\n"
. "Вы создали новый тикет: " . $post->post_title . "\n"
. "Ссылка: " . get_permalink($post_id) . "\n"
. "Спасибо, что используете наш сервис.";
wp_mail($to, $subject, $message);
}
add_action('wp_insert_post', 'wpticket_send_notification_on_new_ticket', 10, 3);
Этот код отправит простое уведомление на email пользователя сразу после создания тикета.
Выводы и рекомендации
Система привязки тикетов к пользователям — ключевой элемент организации службы поддержки на WordPress. Создать ее можно самостоятельно, используя Custom Post Type и стандартные хуки WordPress, а можно ускорить процесс с помощью специализированных плагинов.
Важно уделить внимание безопасности и удобству: показывать пользователю только его тикеты, обеспечивать корректные уведомления и удобный интерфейс.
Используйте приведенные примеры кода как каркас и расширяйте их под свои задачи.