Почему важно автоматически удалять устаревший контент
Ведение сайта на WordPress часто приводит к накоплению большого объема устаревших записей, тикетов, заказов или черновиков. Это нагружает базу данных и замедляет работу сайта. Автоматическое удаление такого контента — эффективный способ оптимизации и поддержания порядка без ручного вмешательства.
Диагностика проблемы: как определить, что пора удалять старый контент
Для начала определите, какой именно контент устарел и подлежит удалению. Например, в тикет-системе — закрытые тикеты старше 90 дней. В WooCommerce — отменённые или завершённые заказы старше 180 дней.
Проверьте объем таких записей запросом в базу данных через phpMyAdmin или WP-CLI:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'ticket' AND post_status = 'closed' AND post_date < NOW() - INTERVAL 90 DAY;Если число большое, автоматизация удаления поможет избежать проблем с производительностью.
Настройка WP-Cron для удаления старого контента: пошаговое руководство
1. Создайте функцию для удаления
Добавьте в functions.php вашей темы или в отдельный плагин следующий код:
function wpticket_delete_old_tickets() {
global $wpdb;
$days = 90; // удалять тикеты старше 90 дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID тикетов для удаления
$old_tickets = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'ticket' AND post_status = 'closed' AND post_date < %s",
$date_threshold
));
if (!empty($old_tickets)) {
foreach ($old_tickets as $post_id) {
wp_delete_post($post_id, true); // принудительное удаление без перемещения в корзину
}
}
}2. Зарегистрируйте событие WP-Cron
Добавьте проверку и регистрацию планировщика:
if (!wp_next_scheduled('wpticket_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpticket_daily_cleanup');
}
add_action('wpticket_daily_cleanup', 'wpticket_delete_old_tickets');Этот код запускает функцию очистки раз в сутки.
Как проверить, что автоматическое удаление работает
- Включите логирование в WordPress, чтобы отследить вызов функции.
- Добавьте временный лог в функцию удаления — например, запись в файл или в error_log:
function wpticket_delete_old_tickets() {
error_log('Запущена очистка старых тикетов');
// остальной код удаления...
}- Проверьте наличие удаления старых записей через админку или через SQL-запрос.
- Для тестирования можно временно уменьшить период удаления, например, до 1 дня.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: на некоторых хостингах WP-Cron работает только при посещении сайта. Рекомендуется настроить системный cron (Linux) на вызов
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron. - Удаление не происходит: проверьте, что хук
wpticket_daily_cleanupзарегистрирован и функция подключена. - Ошибка при удалении записей: убедитесь, что вызывается
wp_delete_post($post_id, true)с параметромtrueдля полного удаления без корзины. - Удаляются не те записи: проверьте условие в SQL-запросе и соответствие
post_typeиpost_status.
Практические советы по безопасности и производительности
- Обязательно делайте резервную копию базы данных перед внедрением автоматического удаления.
- Если удаляемый объем большой, разбивайте процесс на части — например, удалять по 50 записей за раз, чтобы избежать таймаутов.
- Используйте транзакции при работе напрямую с базой, если пишете более сложные запросы.
- Настройте отдельный системный cron для надежного запуска задач, особенно на сайтах с малым трафиком.
- В логах фиксируйте время запуска и количество удалённых записей для мониторинга эффективности.
Сравнение вариантов автоматического удаления контента
| Способ | Преимущества | Недостатки |
|---|---|---|
| WP-Cron (встроенный) | Простота реализации, не требует доступа к серверу | Зависит от посещаемости сайта, может не запускаться регулярно |
| Системный cron (Linux) | Надежный и точный запуск задач | Требует доступа к серверу и знаний серверной админки |
| Плагины-оптимизаторы (например, Clearfy Pro) | Готовые решения с дополнительными функциями | Могут быть избыточны и нагружать сайт |