Как создать систему отслеживания проблем в WordPress с пользовательским статусом тикетов

В современных проектах на 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. Такой подход даст возможность адаптировать тикет-систему под любые бизнес-процессы и автоматизировать рутинные задачи.

Используйте приведённые примеры и расширяйте функционал под свои нужды, комбинируя пользовательские типы записей, статусы и автоматические уведомления.

Как создать собственный виджет в WordPress: подробное руководство с примером кода
02.12.2025
Как избежать проблем с производительностью при обработке большого количества тикетов в WordPress
15.05.2026
Как создать автоматический отчет о проблемах в тикет-системе WordPress
26.02.2026
Оптимизация обработки AJAX-запросов в тикет-системе WordPress
18.06.2026
Оптимизация базы данных для тикет-системы в WordPress
18.03.2026