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