Как использовать WP-Cron для автоматического удаления старых тикетов в WordPress

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

В системах поддержки на базе WordPress с кастомными типами записей «тикет» со временем накапливается большое количество устаревших записей. Это замедляет работу сайта, увеличивает нагрузку на базу данных и усложняет администрирование. Автоматическое удаление тикетов старше определённого возраста помогает удерживать базу в оптимальном состоянии. Проблема в том, что стандартного механизма очистки нет, и ручное удаление неудобно при большом объёме.

Настройка WP-Cron для удаления старых тикетов

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

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

function wpticket_delete_old_tickets() {
    global $wpdb;
    $days = 30; // Удалять тикеты старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $tickets = get_posts(array(
        'post_type'      => 'ticket',
        'post_status'    => 'any',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ));

    if (!empty($tickets)) {
        foreach ($tickets as $ticket_id) {
            wp_delete_post($ticket_id, true); // true - без перемещения в корзину
        }
    }
}

2. Регистрация события WP-Cron

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

add_action('wpticket_daily_cleanup', 'wpticket_delete_old_tickets');

3. Планирование события при инициализации

Добавим проверку и планирование события при загрузке сайта, чтобы оно запускалось ежедневно.

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

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

Чтобы проверить, что очистка работает:

  • В базе данных найдите тикеты со старой датой и запишите их количество.
  • Вручную вызовите функцию wpticket_delete_old_tickets() из админки, например, через WP-CLI или подключив вызов к кнопке в админке.
  • Проверьте, что тикеты удалились (их больше нет в базе).
  • Убедитесь, что планировщик событий запущен: введите в WP-CLI команду wp cron event list и найдите wpticket_daily_cleanup с периодичностью daily.

Частые ошибки и их исправление

  • Событие WP-Cron не запускается: WP-Cron зависит от посещений сайта. Для точной работы настройте системный cron на сервере или используйте плагин WP Crontrol для проверки и ручного запуска.
  • Удаление не происходит: Проверьте, что у кастомного типа записей указано publicly_queryable => true и правильный post_type в запросе. Также убедитесь, что функция wp_delete_post вызывается с параметром true для полного удаления.
  • Высокая нагрузка при обработке большого количества тикетов: Добавьте ограничение на количество удаляемых записей за один запуск, например, posts_per_page => 100 и используйте пагинацию.

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

  • Используйте wp_delete_post с параметром true, чтобы избежать накопления мусора в корзине.
  • Для предотвращения блокировки сервера разбивайте удаление на порции, вызывая функцию в несколько циклов с помощью WP-Cron или AJAX.
  • Регулярно проверяйте логи ошибок сервера на предмет проблем с выполнением cron-задач.
  • Используйте плагин Clearfy Pro для оптимизации базы данных и удаления мусорных данных, что дополнительно ускорит работу сайта (подробнее на wpshop.ru).

Сравнение вариантов автоматического удаления тикетов

МетодОписаниеПлюсыМинусы
WP-Cron + кастомный кодАвтоматическое удаление через планировщик WordPressГибко, не требует внешних плагиновЗависит от посещаемости сайта, возможна задержка в срабатывании
Плагин очистки базыПлагины типа WP-Optimize или Clearfy ProПростота настройки, дополнительные функции оптимизацииМожет быть избыточным, нагрузка на сайт при работе
Ручное удалениеУдаление через админ-панель или WP-CLIПростота, полный контрольНе автоматизировано, требует времени
Как сделать автоматический резерв журналов ошибок WordPress
13.02.2026
Как отладить и исправить проблемы с неработающими AJAX-запросами в тикет-системе WordPress
04.05.2026
Как создать автоматический отчет о проблемах в тикет-системе WordPress
26.02.2026
Автоматическое присвоение ответственных сотрудников тикетам в WordPress
22.02.2026
Как добавить автоматическое сохранение тикета в WordPress
17.12.2025