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

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

В крупных тикет-системах на WordPress база данных быстро разрастается из-за накопления большого количества старых тикетов, которые уже не актуальны. Это замедляет работу сайта и усложняет администрирование. Ручное удаление неудобно и требует постоянного контроля. Поэтому автоматизация удаления тикетов, например, старше 90 дней, — важный этап оптимизации.

Как работает WP-Cron и почему он подходит для задачи

WP-Cron — встроенный планировщик задач WordPress, позволяющий запускать функции по расписанию. Он не требует настройки системного cron на сервере, что удобно для большинства хостингов. С помощью WP-Cron можно настроить периодическую очистку базы от устаревших тикетов, вызывая PHP-функцию удаления.

Основные ограничения WP-Cron

  • Запускается при посещении сайта, если нет трафика, задачи могут задержаться;
  • Не подходит для критически точного тайминга;
  • Для высокой нагрузки можно настроить системный cron, чтобы вызывать WP-Cron вручную.

Пошаговое решение: добавляем автоматическое удаление старых тикетов

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

function wpticket_delete_old_tickets() {
    global $wpdb;
    $days = 90; // количество дней для хранения тикетов
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Предполагается, что тикеты — это кастомный тип записей 'ticket'
    $tickets_to_delete = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'ticket' AND post_date < %s AND post_status = 'publish'",
        $date_threshold
    ));

    foreach ($tickets_to_delete as $ticket_id) {
        wp_delete_post($ticket_id, true); // принудительное удаление
    }
}

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

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

3. Привязываем функцию удаления к событию

add_action('wpticket_daily_cleanup', 'wpticket_delete_old_tickets');

4. Очистка при деактивации плагина (опционально)

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

Как проверить, что автоматическое удаление работает

  • Включите отладку WP-Cron, например, с помощью плагина WP Crontrol — проверьте наличие события wpticket_daily_cleanup.
  • Создайте тестовый тикет со старой датой (более 90 дней). Можно вручную изменить дату через базу или adminer.
  • Выполните WP-Cron вручную или дождитесь запуска (обычно при заходе на сайт).
  • Проверьте, что тестовый тикет удален из базы (в админке или через запрос к базе).

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

  • Ошибка: Событие WP-Cron не запускается.
    Причина: Нет посетителей сайта для триггера WP-Cron.
    Решение: Настройте системный cron для вызова wp-cron.php (пример: wget -q -O - https://example.com/wp-cron.php?doing_wp_cron).
  • Ошибка: Тикеты не удаляются.
    Причина: Неправильный post_type или статус в запросе.
    Решение: Проверьте, что ваш тип записей действительно называется 'ticket', и их статус 'publish'.
  • Ошибка: Функция удаления вызывает ошибки или тормозит сайт.
    Решение: Разбейте удаление на партии, чтобы не перегрузить сервер, используйте транзакции или WP_Query с постраничной обработкой.

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

  • Добавляйте проверку прав пользователя, если функция удаления вызывается из админки.
  • Для больших баз используйте пакетное удаление (например, по 50 тикетов за один запуск).
  • Регистрируйте кастомный интервал времени, если нужно запускать очистку чаще или реже, чем 'daily'.
  • Используйте транзиенты или опции для хранения времени последнего удаления, чтобы избежать повторных запусков.

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

МетодПлюсыМинусыПример
WP-CronНе требует доступа к серверу, простота настройкиЗависит от посещаемости сайта, не идеально для точного расписанияПример из статьи
Системный cron + WP-CLIТочная периодичность, высокая надежностьТребует доступа к серверу и знания консолиwp post delete $(wp post list --post_type=ticket --date_query_column=post_date --before='90 days ago' --format=ids)
Плагины автоматизацииУдобный интерфейс, дополнительные функцииМожет нагружать сайт, зависит от плагинаWP Crontrol, Advanced Cron Manager
Как добавить автоматическое сохранение формы в WordPress с помощью AJAX
10.04.2026
Как правильно удалить плагин WordPress без остатков
26.05.2026
Как сделать автоматическую архивацию истории тикетов в WordPress
13.02.2026
Как автоматически удалять старые тикеты в WordPress
23.04.2026
Как создать автоматический отчет о проблемах в тикет-системе WordPress
26.02.2026