Как использовать WP-Cron для автоматического удаления старой реши в WooCommerce

Диагностика проблемы: почему нужно удалять старую решу в WooCommerce

В WooCommerce под «решей» понимают записи заказов с определённым статусом, например, отменённые или отклонённые заказы, которые больше не используются. Со временем таких заказов накапливается много, что может замедлить работу сайта и увеличить размер базы данных. Если не очищать базу, ухудшается производительность запросов и бэкапов.

Проверить количество таких заказов можно через phpMyAdmin, выполнив запрос:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

Если число превышает несколько тысяч, стоит задуматься об автоматизации удаления.

Пошаговое решение: настройка WP-Cron для удаления старых заказов

1. Создаём функцию для удаления заказов старше N дней с определённым статусом

Добавьте следующий код в functions.php вашей темы или в кастомный плагин:

function wplog_delete_old_cancelled_orders() {
    global $wpdb;
    $days = 30; // удалять заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    $orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'shop_order' 
         AND post_status = 'wc-cancelled' 
         AND post_date < %s",
         $date_threshold
    ));

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — удаление без перемещения в корзину
        }
    }
}

2. Регистрируем событие WP-Cron для регулярного запуска удаления

Добавьте в functions.php следующий код для создания события при активации темы:

function wplog_schedule_order_cleanup() {
    if (!wp_next_scheduled('wplog_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wplog_daily_order_cleanup');
    }
}
add_action('wp', 'wplog_schedule_order_cleanup');

И привяжите функцию удаления к событию:

add_action('wplog_daily_order_cleanup', 'wplog_delete_old_cancelled_orders');

3. Очистка при деактивации темы или плагина

Чтобы не создавать мусор в WP-Cron, добавьте удаление расписания:

function wplog_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wplog_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wplog_daily_order_cleanup');
    }
}
add_action('switch_theme', 'wplog_clear_order_cleanup_schedule');

Проверка результата после внедрения

  • Ожидайте выполнения задачи в 00:00 по серверному времени (стандартный запуск WP-Cron при посещении сайта).
  • Для ручного запуска используйте WP-CLI: wp cron event run wplog_daily_order_cleanup.
  • Проверьте базу заказов через phpMyAdmin, выполнив запрос из раздела диагностики, чтобы убедиться в уменьшении числа старых отменённых заказов.
  • Добавьте логирование в функцию удаления, например, error_log('Deleted order ID: '.$order_id);, чтобы отследить процесс в debug.log.

Частые ошибки и как их исправить

  • WP-Cron не запускается автоматически
    Причина: отсутствие посещений сайта или отключён WP-Cron.
    Решение: настроить системный cron на сервере для вызова wp-cron.php или запускать вручную через WP-CLI.
  • Заказы не удаляются
    Причина: неверный статус заказа или дата.
    Решение: проверьте статус в базе данных, возможно, статус в коде отличается (например, wc-cancelled vs cancelled).
  • Удаляются нужные заказы
    Причина: неправильный фильтр по дате или статусу.
    Решение: добавьте дополнительные условия, например, проверяйте мета-данные заказа.
  • Производительность падает
    Причина: удаление большого количества заказов за один цикл.
    Решение: ограничьте количество удаляемых заказов за раз, например, через LIMIT 50 в запросе.

Практические советы по безопасности и производительности

  • Используйте wp_delete_post($order_id, true) с осторожностью, так как удаление без корзины необратимо.
  • Для сайтов с большим объёмом данных внедрите пакетную обработку удалений с использованием OFFSET и LIMIT.
  • Отключайте WP-Cron и используйте системный cron для стабильности на высоконагруженных сайтах.
  • Перед удалением делайте резервные копии базы данных.
  • Если используете плагины кеширования, очищайте кеш после очистки заказов.

Сравнение вариантов автоматизации удаления заказов

МетодПлюсыМинусыКогда использовать
WP-Cron с кастомным кодомПолный контроль, бесплатно, без сторонних плагиновЗависит от посещаемости, требует навыков программированияСредние и крупные сайты с разработчиком
Плагины для очистки базыПростота установки, интерфейсМогут конфликтовать, не всегда гибкие настройкиМалые сайты, без навыков кода
Системный cron с WP-CLIНадёжность, не зависит от посещенийНужен доступ к серверу и консолиКрупные или высоконагруженные сайты
Как использовать WooCommerce Webhooks для автоматизации задач
25.04.2026
Как добавить обязывающее сообщение об ошибке 404 в WooCommerce
10.05.2026
Как изменить главный заголовок страницы в WordPress без плагинов
20.12.2025
Как избежать конфликтов в хуках WordPress при использовании пользовательского кода
16.06.2026
Ограничение количества категорий для постов в WordPress: практическое руководство
24.01.2026