WooCommerce: как автоматически изменять статус заказа по условиям

Диагностика задачи: зачем нужно автоматическое изменение статусов

В стандартном WooCommerce смена статуса заказа происходит вручную или при определённых триггерах, например, при оплате. Иногда нужна более гибкая автоматизация — например, перевод заказа в статус «Выполнен» после отправки товара, или перевод в «Отменён» при определённых условиях (например, если прошло слишком много времени без оплаты).

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

Как определить, что автоматизация статусов актуальна

  • Вы получаете много заказов с одинаковыми условиями обработки.
  • Стандартные триггеры WooCommerce не покрывают все ваши сценарии.
  • Хотите уменьшить количество ошибок оператора и ускорить обработку заказов.

Пошаговое решение: программное изменение статуса заказа

1. Используем хук для проверки условий

Например, меняем статус на «completed», если заказ оплачен и прошло 3 дня с момента оплаты (имитируем автоматическую отправку товара).

add_action('woocommerce_order_status_processing', 'auto_complete_order_after_days', 20, 1);
function auto_complete_order_after_days($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $paid_date = $order->get_date_paid();
    if (!$paid_date) return;

    $now = new DateTime('now', new DateTimeZone('UTC'));
    $paid_date->setTimezone(new DateTimeZone('UTC'));

    $interval = $paid_date->diff($now)->days;
    if ($interval >= 3) {
        $order->update_status('completed', 'Автоматическое завершение заказа через 3 дня после оплаты');
    }
}

2. Создаем проверку для отмены неоплаченных заказов

Пример: отменяем заказы, которые остаются в статусе «on-hold» более 7 дней.

add_action('woocommerce_order_status_on-hold', 'auto_cancel_unpaid_orders', 20, 1);
function auto_cancel_unpaid_orders($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $created_date = $order->get_date_created();
    if (!$created_date) return;

    $now = new DateTime('now', new DateTimeZone('UTC'));
    $created_date->setTimezone(new DateTimeZone('UTC'));

    $interval = $created_date->diff($now)->days;
    if ($interval >= 7) {
        $order->update_status('cancelled', 'Автоматическая отмена неоплаченного заказа через 7 дней');
    }
}

3. Запускаем проверку с помощью WP-Cron

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

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

add_action('daily_order_status_update', 'process_order_status_updates');
function process_order_status_updates() {
    $args = [
        'limit' => -1,
        'status' => ['processing', 'on-hold'],
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        if ($order->get_status() === 'processing') {
            auto_complete_order_after_days($order->get_id());
        }
        if ($order->get_status() === 'on-hold') {
            auto_cancel_unpaid_orders($order->get_id());
        }
    }
}

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

  • Создайте тестовый заказ и установите статус «processing» с датой оплаты 3 и более дней назад — статус должен автоматически смениться на «completed» после запуска WP-Cron.
  • Создайте заказ в статусе «on-hold» с датой создания более 7 дней назад — он должен автоматически перейти в статус «cancelled».
  • Проверьте журнал WooCommerce или используйте плагин «WP Crontrol» для управления и просмотра запланированных задач.

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

  • WP-Cron не запускается автоматически. Часто бывает на локальных серверах или при низкой посещаемости сайта. Решение: настроить системный cron для вызова wp-cron.php или использовать плагин для имитации запуска.
  • Неправильные временные зоны. Проверяйте, что сравниваете даты в одной временной зоне (обычно UTC). Иначе интервал будет считаться некорректно.
  • Отсутствие проверки на существование объекта заказа. Добавьте проверки if (!$order) return;, чтобы избежать ошибок при удалении или некорректных ID.

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

  • Не обрабатывайте заказы массово в одном запросе, если их много — используйте пагинацию или лимит.
  • Для отладки включайте WP_DEBUG и ведите логи ошибок, чтобы контролировать сбои.
  • Не меняйте статус заказов без явного условия, чтобы не нарушить логику работы магазина и учёт заказов.

Сравнение подходов: плагин против кастомного кода

КритерийПлагин (например, AutomateWoo)Кастомный кодКомпромисс
ГибкостьВысокая, но ограничена функционалом плагинаАбсолютная, под любые условияКод сложнее поддерживать
ПроизводительностьМожет добавлять нагрузкуОптимизированный код — меньше нагрузкиТребует навыков разработки
СтоимостьПлатные лицензииБесплатно, если умеете писать кодВремя на разработку
ПоддержкаПрофессиональная поддержкаСамостоятельное сопровождениеЗависит от навыков
Автоматическое создание категорий и подкатегорий в WordPress с примером кода
31.01.2026
Как избежать проблем с отключением WP-Cron в WordPress
20.04.2026
WooCommerce: как исключить товары из корзины по атрибутам
02.05.2026
Как изменить структуру URL в WordPress без плагинов
24.01.2026
Как автоматизировать удаление старых неиспользуемых медиафайлов в WordPress
19.02.2026