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

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

WooCommerce по умолчанию не удаляет старые заказы из базы данных, что приводит к увеличению объема базы, замедлению работы админки и росту нагрузки на сервер. Особенно это критично для магазинов с большим количеством заказов. Регулярное удаление устаревших заказов помогает поддерживать производительность и экономить ресурсы.

Настройка WP-Cron для автоматического удаления старых заказов

Что такое WP-Cron и почему он нужен

WP-Cron — это встроенный планировщик задач WordPress, позволяющий запускать функции в заданное время или по расписанию. Использовать WP-Cron удобно для периодических задач, например, для очистки базы.

Пошаговое решение

  1. Добавляем кастомную функцию для удаления заказов старше N дней. Для примера — удалим заказы старше 90 дней:

    function wppuzzle_delete_old_orders() {
        $days = 90;
        $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
        $args = [
            'limit' => -1,
            'status' => ['completed', 'cancelled', 'failed', 'refunded'],
            'date_created' => '<' . $date,
            'return' => 'ids',
        ];
    
        $orders = wc_get_orders($args);
    
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // перемещаем в корзину
            // Для полного удаления используйте wp_delete_post($order_id, true);
        }
    }
  2. Создаем событие WP-Cron, запускающее эту функцию раз в сутки:

    function wppuzzle_schedule_old_orders_cleanup() {
        if (!wp_next_scheduled('wppuzzle_cleanup_event')) {
            wp_schedule_event(time(), 'daily', 'wppuzzle_cleanup_event');
        }
    }
    add_action('wp', 'wppuzzle_schedule_old_orders_cleanup');
    
    add_action('wppuzzle_cleanup_event', 'wppuzzle_delete_old_orders');
  3. Добавляем очистку при деактивации плагина или темы, чтобы избежать мусора в WP-Cron:

    function wppuzzle_cleanup_cron() {
        $timestamp = wp_next_scheduled('wppuzzle_cleanup_event');
        if ($timestamp) {
            wp_unschedule_event($timestamp, 'wppuzzle_cleanup_event');
        }
    }
    register_deactivation_hook(__FILE__, 'wppuzzle_cleanup_cron');

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

  • Проверьте наличие запланированного события через WP-CLI командой wp cron event list — в списке должен быть wppuzzle_cleanup_event с периодом daily.
  • Выполните вручную хук для теста:
    do_action('wppuzzle_cleanup_event');
    и проверьте, что старые заказы перемещены в корзину или удалены.
  • Посмотрите в админке WooCommerce → Заказы, старые заказы должны исчезнуть или перейти в корзину.

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

  • WP-Cron не запускается: обычно происходит на сайтах с низким трафиком, так как WP-Cron запускается при загрузке страниц. Решение — настроить системный cron на хостинге, который обращается к wp-cron.php. Пример для Linux:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Удаляются не все заказы: проверьте фильтр статусов в wc_get_orders. По умолчанию заказы в статусе 'pending' или 'processing' не удаляются.
  • Удаление не происходит полностью: функция wp_trash_post() только перемещает заказ в корзину. Для полного удаления используйте wp_delete_post($order_id, true); — будьте осторожны, это необратимо.

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

  • Ограничьте удаление заказов только статусами, которые гарантированно не нужны для отчетности.
  • В больших магазинах удаляйте заказы порциями (например, по 100 заказов в одном запуске), чтобы избежать превышения лимита памяти и времени выполнения.
  • Резервируйте базу перед внедрением автоматического удаления.
  • Используйте WP-Cron совместно с системным cron для стабильности.

Сравнение способов удаления старых заказов

МетодПлюсыМинусы
Ручное удаление через админкуПростота, без кодаТрудоемко, не автоматизировано
WP-Cron + кастомный кодАвтоматично, гибко, без плагиновЗависит от WP-Cron, требует навыков разработки
Плагины для очистки WooCommerceУдобно, настройки в UIДополнительный вес, возможные конфликты
Автоподгрузка контента в WordPress без перезагрузки страницы
04.01.2026
Как отключить автопроигрывание видео в WordPress
01.02.2026
Как использовать WP-Cron для автоматического удаления старого кеша в WooCommerce
23.07.2026
Как использовать WP-Cron для автоматизации задач WooCommerce без ошибок
29.06.2026
Как избежать конфликтов между плагинами WordPress: практические решения
21.01.2026