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 — они значительно ускорят разработку и повысят качество поддержки.