Диагностика проблемы: зачем и когда удалять старые тикеты
В системах поддержки на базе 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 | Простота, полный контроль | Не автоматизировано, требует времени |