В современных проектах на WordPress часто требуется не просто принимать тикеты или обращения от пользователей, но и эффективно управлять их статусами, чтобы быстро отслеживать прогресс решения проблем. В этой статье мы подробно разберём, как создать кастомную систему отслеживания проблем с пользовательскими статусами тикетов, включая примеры кода и рекомендации по использованию готовых плагинов.
Почему стандартных статусов постов недостаточно для тикет-системы?
WordPress по умолчанию поддерживает базовые статусы записей: publish, draft, pending и несколько других. Однако для полноценной тикет-системы этого недостаточно. Например, нам нужны статусы вроде «В работе», «Ожидает ответа», «Закрыт», которые помогут отслеживать, на каком этапе находится каждая заявка.
Создадим расширенный набор статусов, чтобы оптимизировать работу с тикетами.
Добавляем пользовательские статусы для тикетов в WordPress
Для начала зарегистрируем новые статусы с помощью хука init. Добавим следующий код в файл functions.php вашей темы или в собственный плагин.
function wpticket_register_ticket_statuses() {
register_post_status('wpticket_open', array(
'label' => _x('Открыт', 'ticket status'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Открыт <span class="count">(%s)</span>', 'Открыт <span class="count">(%s)</span>'),
));
register_post_status('wpticket_in_progress', array(
'label' => _x('В работе', 'ticket status'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('В работе <span class="count">(%s)</span>', 'В работе <span class="count">(%s)</span>'),
));
register_post_status('wpticket_on_hold', array(
'label' => _x('Ожидает ответа', 'ticket status'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Ожидает ответа <span class="count">(%s)</span>', 'Ожидает ответа <span class="count">(%s)</span>'),
));
register_post_status('wpticket_closed', array(
'label' => _x('Закрыт', 'ticket status'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Закрыт <span class="count">(%s)</span>', 'Закрыт <span class="count">(%s)</span>'),
));
}
add_action('init', 'wpticket_register_ticket_statuses');
Этот код регистрирует четыре новых статуса с префиксом wpticket_, чтобы избежать конфликтов с другими плагинами и темами.
Добавляем статусы в админ-панель для удобного выбора
Теперь нужно сделать так, чтобы новые статусы отображались в выпадающем списке статусов в редакторе записей типа тикет. Для этого используем фильтр display_post_states и добавим отображение в селектор статусов.
function wpticket_append_ticket_status_list() {
global $post;
if ($post->post_type === 'ticket') {
?><script>
jQuery(document).ready(function($){
$('select#post_status').append('<option value="wpticket_open">Открыт</option>');
$('select#post_status').append('<option value="wpticket_in_progress">В работе</option>');
$('select#post_status').append('<option value="wpticket_on_hold">Ожидает ответа</option>');
$('select#post_status').append('<option value="wpticket_closed">Закрыт</option>');
});
</script><?php
}
}
add_action('post_submitbox_misc_actions', 'wpticket_append_ticket_status_list');
Также для отображения статуса рядом с заголовком записи в списке тикетов добавим:
function wpticket_show_custom_post_status($states) {
global $post;
$arg = get_post_status($post->ID);
if ($arg == 'wpticket_open') {
return array('Открыт');
} elseif ($arg == 'wpticket_in_progress') {
return array('В работе');
} elseif ($arg == 'wpticket_on_hold') {
return array('Ожидает ответа');
} elseif ($arg == 'wpticket_closed') {
return array('Закрыт');
}
return $states;
}
add_filter('display_post_states', 'wpticket_show_custom_post_status');
Создаём пользовательский тип записей "ticket" для тикетов
Если у вас ещё нет кастомного типа записей для тикетов, зарегистрируем его:
function wpticket_register_ticket_post_type() {
$labels = array(
'name' => 'Тикеты',
'singular_name' => 'Тикет',
'add_new' => 'Добавить тикет',
'add_new_item' => 'Добавить новый тикет',
'edit_item' => 'Редактировать тикет',
'new_item' => 'Новый тикет',
'view_item' => 'Просмотреть тикет',
'search_items' => 'Поиск тикетов',
'not_found' => 'Тикеты не найдены',
'not_found_in_trash' => 'В корзине тикеты не найдены',
'menu_name' => 'Тикеты'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'show_in_menu' => true,
'supports' => array('title', 'editor', 'author', 'comments'),
'capability_type' => 'post',
'rewrite' => array('slug' => 'tickets'),
);
register_post_type('ticket', $args);
}
add_action('init', 'wpticket_register_ticket_post_type');
Теперь в админке появится отдельный раздел для работы с тикетами, где можно будет назначать новые статусы.
Автоматизация смены статусов и уведомления
Чтобы система была удобной, рекомендуем автоматизировать смену статусов и отправку уведомлений. Например, при новом комментарии в тикете можно переводить статус в «В работе», а при закрытии тикета — отправлять уведомление автору.
function wpticket_update_status_on_comment($comment_ID, $comment_approved, $commentdata) {
if ($comment_approved >= 1) {
$post_id = $commentdata['comment_post_ID'];
$post_type = get_post_type($post_id);
if ($post_type === 'ticket') {
$current_status = get_post_status($post_id);
if ($current_status !== 'wpticket_in_progress') {
wp_update_post(array(
'ID' => $post_id,
'post_status' => 'wpticket_in_progress'
));
}
}
}
}
add_action('comment_post', 'wpticket_update_status_on_comment', 10, 3);
Для уведомлений можно использовать стандартные функции WordPress или плагин Clearfy Pro, который значительно расширяет возможности по автоматизации и безопасности.
Пример кастомного запроса для вывода тикетов по статусу
Для вывода тикетов с определённым статусом используйте WP_Query:
$args = array(
'post_type' => 'ticket',
'post_status' => 'wpticket_on_hold',
'posts_per_page' => 10
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h3>' . get_the_title() . '</h3>';
echo '<p>' . get_the_excerpt() . '</p>';
}
wp_reset_postdata();
} else {
echo 'Тикеты со статусом "Ожидает ответа" не найдены.';
}
Использование плагинов для расширения функционала тикет-системы
Если хотите минимизировать разработку, обратите внимание на готовые решения. Например, WPRemark — удобный плагин для комментариев и тикетов с возможностью добавления статусов и управления ими из админки.
Также для визуализации статусов можно использовать ABC Pagination, чтобы выводить тикеты постранично с фильтрацией по статусам.
Итог: гибкость и масштабируемость решения
Реализация кастомных статусов позволяет создать удобную и понятную систему отслеживания проблем в WordPress. Такой подход даст возможность адаптировать тикет-систему под любые бизнес-процессы и автоматизировать рутинные задачи.
Используйте приведённые примеры и расширяйте функционал под свои нужды, комбинируя пользовательские типы записей, статусы и автоматические уведомления.