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