WooCommerce: решение проблемы неработающего автозапуска удаления заказов по статусу

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

Частая задача — удалять заказы автоматически по определённому статусу (например, отменённые, неоплаченные). Обычно для этого используют WP-Cron с хуками WooCommerce. Однако бывает, что запланированное задание не запускается, и заказы не удаляются.

Причины могут быть следующие:

  • WP-Cron отключён или не работает: если на сайте мало трафика или WP-Cron отключён в wp-config.php, задачи не запускаются автоматически.
  • Неправильное использование хуков WooCommerce: некоторые статусы заказов можно обрабатывать только после определённых событий, а не в произвольный момент.
  • Ошибки в коде удаления: неправильные функции удаления заказов или отсутствие проверки прав доступа.
  • Кеширование админки или страниц: может мешать выполнению AJAX-запросов или фоновых задач.

Пошаговое решение: как корректно настроить удаление заказов по статусу с использованием WP-Cron

1. Проверяем WP-Cron

В файле wp-config.php должна отсутствовать строка define('DISABLE_WP_CRON', true); или она должна быть закомментирована. Чтобы проверить работу WP-Cron, добавьте в functions.php:

add_action('wp', function() { if (!wp_next_scheduled('test_cron_hook')) { wp_schedule_event(time() + 60, 'hourly', 'test_cron_hook'); } });
add_action('test_cron_hook', function() { error_log('WP-Cron работает'); });

Через час проверьте error_log — если сообщение есть, WP-Cron работает.

2. Создаём функцию удаления заказов по статусу

Напишем безопасный код для удаления заказов со статусом cancelled, которым больше 7 дней:

function wc_delete_old_cancelled_orders() {
    $args = [
        'status' => 'cancelled',
        'date_modified' => '<' . (time() - WEEK_IN_SECONDS),
        'limit' => -1,
        'return' => 'ids',
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            wp_delete_post($order_id, true); // жесткое удаление
        }
    }
}

3. Регистрируем WP-Cron задачу

add_action('wc_delete_old_cancelled_orders_hook', 'wc_delete_old_cancelled_orders');

if (!wp_next_scheduled('wc_delete_old_cancelled_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_old_cancelled_orders_hook');
}

4. Проверяем права пользователя и окружение

Удаление заказов происходит от имени сервера, так что дополнительной проверки доступа не нужно. Но убедитесь, что нет плагинов безопасности, блокирующих wp_delete_post.

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

  • Убедитесь, что в заказах WooCommerce есть отменённые заказы старше 7 дней.
  • Запустите вручную код удаления, вызвав функцию wc_delete_old_cancelled_orders() из админки (например, через плагин Code Snippets).
  • Проверьте, что заказы удалились.
  • Подождите следующий запуск WP-Cron (запланирован на каждый день) и проверьте, что новые старые заказы удаляются автоматически.
  • Для отладки можете добавить error_log внутри цикла удаления, чтобы видеть процесс.

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

  • WP-Cron не срабатывает: проверьте отсутствие DISABLE_WP_CRON, убедитесь в посещаемости сайта или настройте системный cron на сервере для запуска wp-cron.php.
  • Функция удаления не вызывается: проверьте, что хук правильно зарегистрирован, и событие запланировано.
  • Удаление не происходит из-за кеша: отключите кеширование на страницах админки или исключите wp-cron из кеша.
  • Удаление заказов вызывает ошибки: используйте wp_delete_post($order_id, true) для полного удаления, а не wp_trash_post.

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

  • Не удаляйте заказы сразу после изменения статуса: дайте клиентам и службе поддержки время проверить заказ.
  • Ограничьте количество удаляемых заказов за один запуск, чтобы не перегружать сервер. Пример: limit => 50.
  • Используйте транзакции или логи, если хотите отслеживать удалённые заказы.
  • При большом количестве заказов лучше запускать удаление частями с WP-Cron каждые несколько часов.
  • Регулярно проверяйте журнал ошибок, чтобы вовремя отследить сбои.

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

МетодПреимуществаНедостатки
WP-Cron + собственный кодГибкость, отсутствие плагинов, полный контрольЗависит от WP-Cron, требует навыков программирования
Плагины типа Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpbe.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-zakazov-po-probleme-neudalnogo-hooka)Простота настройки, дополнительные функции оптимизацииЗависимость от стороннего кода, возможные конфликты
Системный cron на сервереНадёжность, не зависит от посещаемости сайтаТребует доступа к серверу и навыков настройки
Автоматическое обновление статуса заказа в WooCommerce по срокам
23.05.2026
Как использовать AJAX для динамической загрузки контента в WordPress
01.02.2026
WooCommerce: автоматическое удаление заказов по неоплаченному статусу и срокам
05.07.2026
WooCommerce: автоматическое удаление отменённых и возвращённых заказов по сроку
15.06.2026
WooCommerce: как установить ограничения на количество товаров в корзине
30.04.2026