Как создать кастомный фильтр для тикетов в WPtickets

WPtickets — мощный плагин для поддержки клиентов в WordPress, который позволяет удобно управлять заявками (тикетами). Однако стандартных фильтров иногда бывает недостаточно, особенно если нужна тонкая кастомизация под конкретные бизнес-процессы. В этой статье мы подробно разберём, как создать кастомный фильтр для тикетов в WPtickets с примерами кода, чтобы повысить удобство работы с тикетами и автоматизировать рутинные задачи.

Почему нужны кастомные фильтры для тикетов в WPtickets

Стандартные фильтры в WPtickets позволяют сортировать тикеты по статусу, приоритету, дате и другим основным параметрам. Но в реальных условиях поддержки часто возникает потребность отобрать тикеты по более специфичным критериям, например:

  • Тикеты с определённым тегом или пользовательским полем;
  • Заявки от клиентов из определённого региона;
  • Тикеты с пропущенными SLA;
  • Заявки, требующие эскалации.

Кастомные фильтры позволяют реализовать эти и другие сценарии, не прибегая к громоздким и медленным SQL-запросам вручную.

Как работает фильтрация в WPtickets: базовые понятия

WPtickets хранит тикеты как пользовательские записи (custom post type) с названием wpticket. Фильтрация происходит через WP_Query с использованием параметров, которые можно расширять с помощью хуков и фильтров WordPress.

Для создания кастомного фильтра нам нужно добавить пользовательские параметры в форму фильтрации в админке и обработать их в запросах WP_Query.

Добавление кастомного параметра фильтрации в админке WPtickets

Для начала добавим новый фильтр по пользовательскому полю, например, по коду клиента — мета-поле client_code.

Добавим поле фильтра в список тикетов в админке через хук restrict_manage_posts:

add_action('restrict_manage_posts', 'wptickets_add_custom_filter');
function wptickets_add_custom_filter() {
    global $typenow;
    if ($typenow !== 'wpticket') return;

    $client_code = isset($_GET['client_code_filter']) ? sanitize_text_field($_GET['client_code_filter']) : '';

    echo '<input type="text" name="client_code_filter" placeholder="Код клиента" value="' . esc_attr($client_code) . '" style="margin-left:10px;" />';
}

Этот код добавит текстовое поле для фильтрации по коду клиента в верхней части списка тикетов.

Обработка параметра в запросе тикетов

Чтобы фильтр работал, нужно изменить запрос WP_Query, добавив условие по мета-полю client_code. Для этого используем хук pre_get_posts:

add_action('pre_get_posts', 'wptickets_filter_by_client_code');
function wptickets_filter_by_client_code($query) {
    global $pagenow;
    $post_type = isset($_GET['post_type']) ? $_GET['post_type'] : '';

    if ($pagenow === 'edit.php' && $post_type === 'wpticket' && !empty($_GET['client_code_filter'])) {
        $meta_query = array(
            array(
                'key' => 'client_code',
                'value' => sanitize_text_field($_GET['client_code_filter']),
                'compare' => 'LIKE'
            )
        );
        $query->set('meta_query', $meta_query);
    }
}

Теперь при вводе кода клиента в фильтр будут отображаться только тикеты, содержащие этот код в мета-поле.

Пример расширенного кастомного фильтра: выбор тикетов по дате последнего ответа

Иногда нужно фильтровать тикеты, например, по дате последнего комментария. В WPtickets комментарии — это ответы в тикетах. Для этого можно использовать мета-поле last_response_date, которое обновлять при добавлении комментария (пример кода для обновления внизу), а затем фильтровать тикеты по этому полю.

Автоматическое обновление даты последнего ответа

add_action('comment_post', 'wptickets_update_last_response_date', 10, 3);
function wptickets_update_last_response_date($comment_ID, $comment_approved, $commentdata) {
    if ($comment_approved && $commentdata['comment_type'] === 'wpticket') {
        $post_id = $commentdata['comment_post_ID'];
        update_post_meta($post_id, 'last_response_date', current_time('mysql'));
    }
}

Добавление фильтра по дате последнего ответа

Добавим в админку поле для выбора даты:

add_action('restrict_manage_posts', 'wptickets_add_last_response_date_filter');
function wptickets_add_last_response_date_filter() {
    global $typenow;
    if ($typenow !== 'wpticket') return;
    $date = isset($_GET['last_response_date']) ? sanitize_text_field($_GET['last_response_date']) : '';
    echo '<input type="date" name="last_response_date" value="' . esc_attr($date) . '" style="margin-left:10px;" />';
}

И обработаем фильтр:

add_action('pre_get_posts', 'wptickets_filter_by_last_response_date');
function wptickets_filter_by_last_response_date($query) {
    global $pagenow;
    $post_type = isset($_GET['post_type']) ? $_GET['post_type'] : '';
    if ($pagenow === 'edit.php' && $post_type === 'wpticket' && !empty($_GET['last_response_date'])) {
        $meta_query = array(
            array(
                'key' => 'last_response_date',
                'value' => sanitize_text_field($_GET['last_response_date']),
                'compare' => '>=',
                'type' => 'DATE'
            )
        );
        $query->set('meta_query', $meta_query);
    }
}

Как улучшить производительность кастомных фильтров

Фильтрация по мета-полям может негативно сказаться на скорости, особенно при большом количестве тикетов. Для оптимизации рекомендуется:

  • Использовать индексированные мета-поля или кастомные таблицы для хранения важных данных;
  • Кэшировать результаты запросов с помощью Transients API;
  • Минимизировать количество условий meta_query и использовать сравнения = вместо LIKE где возможно;
  • Использовать сторонние плагины для оптимизации запросов, например, Clearfy Pro (подробнее на WPSHOP).

Дополнительные советы по кастомизации WPtickets

Помимо фильтров, для расширения функционала WPtickets полезно:

  • Добавлять собственные колонки в таблицу списка тикетов (используйте хуки manage_wpticket_posts_columns и manage_wpticket_posts_custom_column);
  • Создавать автоматические действия на основе фильтров, например, автоматическое назначение ответственного при определённом фильтре;
  • Интегрировать WPtickets с другими плагинами, например, WPRemark для анализа и обработки тикетов с помощью ИИ (подробнее).

Итог

Создание кастомных фильтров в WPtickets позволяет сделать систему поддержки более гибкой и удобной под конкретные задачи. С помощью добавления своих полей фильтрации и обработки запросов через хуки WordPress можно легко расширить функционал без изменения ядра плагина. Приведённые примеры кода помогут быстро начать работу и адаптировать фильтры под свои нужды.

Если нужны готовые решения или помощь с кастомизацией, рекомендуем обратить внимание на продукты из WPSHOP — они значительно ускорят разработку и повысят качество поддержки.

Оптимизация производительности WordPress при работе с большими базами данных
28.11.2025
Как отладить проблемы с отслеживанием статусов тикетов в WPtickets
05.06.2026
Как использовать DPDK и PHP Queue для обработки тикетов в WPtickets
09.06.2026
Как создать комплексную систему отзывов и обработки тикетов в WordPress
01.03.2026
Как создать автоматический отчет по просмотру тикетов в WPtickets для WordPress
09.04.2026