В системах управления тикетами на WordPress со временем количество заявок может существенно вырасти, что замедляет работу сайта и усложняет поиск нужной информации. Чтобы решить эту проблему, часто применяют автоматическую архивацию старых тикетов. В этой статье подробно рассмотрим, как реализовать такую функцию самостоятельно и с помощью плагинов, а также приведем примеры кода.
Почему важна автоматическая архивация тикетов
Архивация — это перенос устаревших записей в отдельный раздел или базу данных, где они не мешают основной работе, но сохраняются для истории и отчетности. В случае с тикетами это помогает:
- Уменьшить нагрузку на базу данных и ускорить загрузку страниц с текущими тикетами.
- Сделать интерфейс более удобным — старые заявки не мешают оператору.
- Обеспечить сохранность данных для аудита и статистики.
Для WordPress такой функционал не всегда есть из коробки, поэтому его приходится делать самостоятельно или через сторонние решения.
Как реализовать автоматическую архивацию тикетов программно
Предположим, у вас есть кастомный тип записей ticket, в котором хранятся тикеты. Задача — периодически переносить тикеты, закрытые более 30 дней назад, в архив (например, менять статус или добавлять метку).
Шаг 1. Добавляем новый статус для архивных тикетов
WordPress по умолчанию не имеет статуса «архив», поэтому добавим его:
function wpticket_register_ticket_archive_status() {
register_post_status('archived', array(
'label' => _x('Архив', 'post'),
'public' => false,
'exclude_from_search' => true,
'show_in_admin_all_list' => false,
'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_archive_status');Этот код добавляет новый статус, который не отображается на сайте, но виден в админке.
Шаг 2. Создаем функцию для архивации старых тикетов
Напишем функцию, которая найдет все тикеты со статусом closed, у которых дата закрытия старше 30 дней, и переведет их в статус archived:
function wpticket_archive_old_tickets() {
$args = array(
'post_type' => 'ticket',
'post_status' => 'closed',
'date_query' => array(
array(
'column' => 'post_modified_gmt',
'before' => '30 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$tickets = get_posts($args);
foreach ($tickets as $ticket_id) {
wp_update_post(array(
'ID' => $ticket_id,
'post_status' => 'archived',
));
}
}Здесь мы используем date_query по дате изменения, чтобы выбрать старые тикеты. В зависимости от логики можно использовать другую дату, например, дату закрытия, если она хранится в метаполях.
Шаг 3. Запускаем функцию по расписанию
Чтобы автоматизировать процесс, создадим cron-задачу WordPress, которая будет запускать функцию раз в сутки:
function wpticket_schedule_archive_cron() {
if (!wp_next_scheduled('wpticket_daily_archive_event')) {
wp_schedule_event(time(), 'daily', 'wpticket_daily_archive_event');
}
}
add_action('wp', 'wpticket_schedule_archive_cron');
add_action('wpticket_daily_archive_event', 'wpticket_archive_old_tickets');<Так мы гарантируем, что каждый день будет выполняться проверка и архивация старых тикетов.
Использование плагинов для управления тикетами и архивацией
Если вы предпочитаете готовые решения, обратите внимание на плагины, которые позволяют строить полноценные тикет-системы с возможностью архивации:
- Expert Review — плагин для отзывов и тикетов, в котором есть функционал статусов и фильтров. Можно настроить автоматические действия через хуки плагина.
- WPRemark — современный инструмент для комментариев и тикетов, поддерживает кастомные статусы и автоматизацию.
В таких плагинах часто есть встроенные события и фильтры, позволяющие добавлять логику архивации без написания кода с нуля.
Как отображать архивные тикеты в админке и на сайте
Добавленный статус archived не отображается в обычных списках тикетов, но иногда нужно получить к ним доступ. Для этого можно добавить фильтр в админку:
function wpticket_add_archived_status_to_filter($post_statuses) {
$post_statuses['archived'] = 'Архив';
return $post_statuses;
}
add_filter('display_post_states', 'wpticket_add_archived_status_to_filter');Также можно создавать отдельные страницы или виджеты, где будут выводиться архивные тикеты по запросу с post_status=archived.
Пример запроса для вывода архивных тикетов
$archived_tickets = get_posts(array(
'post_type' => 'ticket',
'post_status' => 'archived',
'posts_per_page' => 20,
));Далее можно вывести список на фронтенде для поддержки пользователей или аналитиков.
Рекомендации по оптимизации и безопасности
При реализации архивации важно учесть несколько моментов:
- Перед массовыми обновлениями делайте резервную копию базы.
- Проверяйте права пользователя, который запускает функции, чтобы избежать несанкционированного изменения данных.
- Если в тикетах есть вложения, продумайте, нужно ли их перемещать или удалять при архивации.
- Регулярно очищайте архив, если данные устарели окончательно, чтобы не захламлять базу.
Для расширенной работы с базой используйте транзакции и оптимизируйте запросы, чтобы не создавать нагрузку на сервер.
Выводы и полезные ссылки
Автоматическая архивация тикетов — важный элемент поддержания производительности и удобства работы с системой заявок. Используя приведенный пример, вы сможете самостоятельно добавить такой функционал в ваш сайт на WordPress. Также рекомендуем изучить плагины Expert Review и WPRemark для расширенных возможностей.
Полезные ссылки: