Как автоматизировать удаление старых тикетов в WordPress

Диагностика проблемы с устаревшими тикетами

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

Для диагностики проблемы выполните следующие шаги:

  • Оцените количество записей в кастомном типе записи тикетов через phpMyAdmin: SELECT COUNT(*) FROM wp_posts WHERE post_type = 'ticket';
  • Проверьте размер таблиц базы данных, связанных с тикетами (например, если есть метаполя, таблицы плагина и т.д.).
  • Изучите время отклика страниц со списком тикетов и админки.

Пошаговое решение: автоматическое удаление тикетов по сроку давности

1. Создайте WP-Cron задачу для регулярной очистки

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

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

    $args = [
        'post_type'      => 'ticket',
        'post_status'    => 'any',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_tickets = get_posts($args);

    if (!empty($old_tickets)) {
        foreach ($old_tickets as $ticket_id) {
            wp_delete_post($ticket_id, true); // true — удалить без возможности восстановления
        }
    }
}

function wpt_schedule_delete_old_tickets() {
    if (!wp_next_scheduled('wpt_cron_delete_old_tickets')) {
        wp_schedule_event(time(), 'daily', 'wpt_cron_delete_old_tickets');
    }
}
add_action('wp', 'wpt_schedule_delete_old_tickets');
add_action('wpt_cron_delete_old_tickets', 'wpt_delete_old_tickets');

2. Добавьте возможность настройки срока хранения через админку

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

function wpt_register_settings() {
    add_option('wpt_days_to_keep', 30);
    register_setting('general', 'wpt_days_to_keep', ['type' => 'integer', 'sanitize_callback' => 'absint']);
    add_settings_field(
        'wpt_days_to_keep',
        'Срок хранения тикетов (дней)',
        function() {
            $value = get_option('wpt_days_to_keep', 30);
            echo '<input type="number" min="1" name="wpt_days_to_keep" value="' . esc_attr($value) . '" />';
        },
        'general'
    );
}
add_action('admin_init', 'wpt_register_settings');

function wpt_delete_old_tickets() {
    $days_to_keep = get_option('wpt_days_to_keep', 30);
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));
    // остальной код без изменений
}

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

Для проверки:

  • Запустите вручную функцию удаления в отладочном режиме (например, вызвав wpt_delete_old_tickets() из файла темы или плагина).
  • Посмотрите, удалились ли тикеты старше указанного срока через админку или в базе данных.
  • Проверьте логи сервера и WordPress на предмет ошибок при выполнении WP-Cron.
  • Убедитесь, что WP-Cron запланирован, выполнив в консоли:
wp cron event list --fields=hook,next_run --format=table | grep wpt_cron_delete_old_tickets

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

  • WP-Cron не запускается автоматически: По умолчанию WP-Cron запускается только при посещении сайта. На слабом трафике задания могут задерживаться. Решение — настроить системный cron на сервере для вызова wp-cron.php каждые 5-10 минут.
  • Удаляются не те записи: Убедитесь, что в post_type указан правильный slug тикетов. Проверьте через админку или код, как называется ваш тип записи.
  • Ошибка при удалении из-за прав доступа: Проверьте, что код вызывается с правами администратора и что удаление происходит с флагом $force_delete = true.
  • Перегрузка базы из-за большого объема запросов: Если тикетов слишком много, удаляйте пачками по 100-200 записей за один запуск, чтобы не нагружать базу.

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

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

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

МетодПлюсыМинусы
WP-Cron + собственный кодГибкость, настройка под конкретные задачи, не требует дополнительных плагиновЗависит от посещаемости сайта, может требоваться настройка системного cron
Плагины очистки базы (например, WP-Optimize)Простота настройки, дополнительные инструменты оптимизацииМенее гибкие, не всегда понимают кастомные типы записей, могут удалить лишнее
Ручное удаление через админкуКонтроль за процессом, минимальный риск ошибокТрудоемко при большом количестве тикетов, не автоматизировано
Как создать автоматические эскалации в тикет-системе WordPress
09.02.2026
Как добавить автоматические подписки на изменения тикетов в WordPress
14.03.2026
Как автоматизировать процесс обработки тикетов в WordPress
18.01.2026
Как настроить автозаполнение форм в WordPress с помощью AJAX
28.03.2026
Как создать систему отслеживания проблем в WordPress с пользовательским статусом тикетов
28.12.2025