Диагностика проблемы с устаревшими тикетами
В крупных тикет-системах на 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) | Простота настройки, дополнительные инструменты оптимизации | Менее гибкие, не всегда понимают кастомные типы записей, могут удалить лишнее |
| Ручное удаление через админку | Контроль за процессом, минимальный риск ошибок | Трудоемко при большом количестве тикетов, не автоматизировано |