Как автоматически удалять старые тикеты в WordPress

Диагностика проблемы: зачем удалять старые тикеты

В системах поддержки на WordPress с большим количеством тикетов база данных быстро разрастается, что замедляет работу сайта и усложняет администрирование. Старые тикеты, которые уже неактуальны, занимают место и могут негативно влиять на производительность. Автоматическое удаление устаревших тикетов помогает поддерживать базу в оптимальном состоянии без ручной работы.

Как определить, какие тикеты считать старыми

Обычно под «старыми» понимаются тикеты, которые не обновлялись длительное время или имеют статус «закрыт» и не менялись, например, больше 90 дней. Для точной настройки нужно учитывать бизнес-логику и требования поддержки.

Пример критериев для удаления:

  • Статус тикета: 'closed' или 'resolved'
  • Дата последнего обновления: более 90 дней назад

Пошаговое решение: автоматическое удаление старых тикетов через WP-Cron

1. Создаем функцию удаления тикетов

В файле functions.php вашей темы или в отдельном кастомном плагине добавьте следующий код:

function wpticket_delete_old_tickets() {
    global $wpdb;
    $post_type = 'ticket'; // Замените на ваш CPT для тикетов
    $status_meta_key = '_ticket_status'; // Ключ мета-данных для статуса
    $days_threshold = 90;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_threshold} days"));

    // Получаем ID тикетов со статусом 'closed' старше 90 дней
    $tickets = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
        INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
        WHERE p.post_type = %s
          AND pm.meta_key = %s
          AND pm.meta_value = %s
          AND p.post_modified < %s
          AND p.post_status = 'publish'",
        $post_type, $status_meta_key, 'closed', $date_threshold
    ));

    if (!empty($tickets)) {
        foreach ($tickets as $ticket_id) {
            wp_delete_post($ticket_id, true); // Безвозвратно удаляем тикет
        }
    }
}

2. Регистрируем событие WP-Cron

Добавьте код для запуска функции по расписанию (например, раз в день):

function wpticket_schedule_cron() {
    if (!wp_next_scheduled('wpticket_daily_delete_old_tickets')) {
        wp_schedule_event(time(), 'daily', 'wpticket_daily_delete_old_tickets');
    }
}
add_action('wp', 'wpticket_schedule_cron');

add_action('wpticket_daily_delete_old_tickets', 'wpticket_delete_old_tickets');

3. Удаляем расписание при деактивации плагина или темы

function wpticket_clear_cron() {
    $timestamp = wp_next_scheduled('wpticket_daily_delete_old_tickets');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpticket_daily_delete_old_tickets');
    }
}
register_deactivation_hook(__FILE__, 'wpticket_clear_cron');

Проверка результата после внедрения

Для проверки работы скрипта:

  • Запустите функцию вручную из консоли или через временный хук, например в functions.php вызовите wpticket_delete_old_tickets();.
  • Проверьте в админке, что тикеты с нужным статусом и датой были удалены.
  • Используйте плагин WP Crontrol для контроля и отладки WP-Cron задач.

Частые ошибки и как исправить

  • Неправильный post_type или meta_key: Проверьте, что имя типа записей и ключ мета-данных совпадают с тем, что используется в вашей системе тикетов.
  • WP-Cron не запускается: На некоторых серверах WP-Cron работает только при посещении сайта. Для надежности настройте системный cron, либо используйте плагин WP Crontrol для теста.
  • Удаляются не те тикеты: Проверьте условие в SQL-запросе, возможно, статус или дата указаны неверно.
  • При удалении ошибка прав доступа: Убедитесь, что функция вызывается с достаточными правами, и что пользователь/процесс имеет возможность удалять записи.

Практические советы по безопасности и производительности

  • Резервное копирование: Перед автоматическим удалением всегда делайте регулярный бэкап базы данных.
  • Логирование: Добавьте логирование удаленных тикетов для аудита, например через error_log() или запись в отдельную таблицу.
  • Пакетное удаление: Если тикетов очень много, удаляйте их порциями, чтобы избежать таймаутов.
  • Используйте транзакции MySQL: При необходимости обеспечьте атомарность удаления.

Таблица сравнения методов удаления старых тикетов

МетодОписаниеПлюсыМинусы
WP-Cron функция удаленияРеализация через wp_schedule_event и кастомный кодГибкость, полный контроль, без сторонних плагиновЗависит от работы WP-Cron, требует навыков PHP
Плагины для автоматизацииИспользование готовых плагинов очистки базыПростота настройки, GUIМожет быть избыточным, нагрузка на сайт, ограниченная кастомизация
Системный cron + WP-CLIЗапуск скриптов через системный cron и WP-CLIНадежность, не зависит от посещений сайтаТребует доступа к серверу и навыков администрирования
Как сделать автоматический импорт отзывов в WordPress
10.04.2026
Как создать систему привязки тикетов к пользователям в WordPress
31.01.2026
Добавление автоматического присоединения файлов к тикетам в WordPress
04.01.2026
Как избежать проблем с производительностью при обработке большого количества тикетов в WordPress
15.05.2026
Как создать автоматические эскалации в тикет-системе WordPress
09.02.2026