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

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

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

Ключевой вопрос: как задать условия и реализовать автоматическую смену статусов без использования тяжёлых плагинов и с минимальной нагрузкой?

Как настроить автоматическое изменение статусов заказов в WooCommerce

1. Выбор триггера для автоматизации

Для автоматизации подойдут следующие события и подходы:

  • Использование WP-Cron для периодической проверки заказов по условиям;
  • Хуки WooCommerce, например woocommerce_order_status_changed для реакции на смену статуса;
  • Комбинация фильтров и действий для кастомной логики.

2. Пример: автоматическое перевод заказа в статус "отменён" через 24 часа при неоплате

Реализуем проверку заказов со статусом pending, которые были созданы более 24 часов назад, и меняем статус на cancelled.

function wpgenerate_cancel_unpaid_orders() {
    $args = array(
        'limit' => -1,
        'status' => 'pending',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
    );
    $orders = wc_get_orders( $args );
    foreach ( $orders as $order ) {
        $order->update_status( 'cancelled', 'Автоматический статус: неоплаченный заказ отменён через 24 часа' );
    }
}
add_action( 'wp', function() {
    if ( ! wp_next_scheduled( 'wpgenerate_cron_cancel_unpaid_orders' ) ) {
        wp_schedule_event( time(), 'hourly', 'wpgenerate_cron_cancel_unpaid_orders' );
    }
} );
add_action( 'wpgenerate_cron_cancel_unpaid_orders', 'wpgenerate_cancel_unpaid_orders' );

Этот код добавляет событие WP-Cron, которое ежечасно проверяет неоплаченные заказы и отменяет их, если время превышено.

3. Кастомные условия изменения статусов

Можно расширить логику, например, менять статус на completed после подтверждения оплаты вручную или по API:

add_action( 'woocommerce_payment_complete', 'wpgenerate_set_order_completed' );
function wpgenerate_set_order_completed( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( $order && $order->get_status() === 'processing' ) {
        $order->update_status( 'completed', 'Заказ автоматически завершён после оплаты' );
    }
}

Как проверить, что автоматическое изменение статусов работает

  • В разделе WooCommerce - Заказы проверить, что заказы с соответствующими условиями изменили статус;
  • Просмотреть журнал действий (если есть) или добавить логирование в функции через error_log();
  • Проверить cron-события через плагин WP Crontrol, убедиться, что задача запланирована и выполняется;
  • Тестировать на тестовом заказе с разными сценариями.

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

  • Не срабатывает WP-Cron: стандартный WP-Cron запускается при посещении сайта. На слабых или малопосещаемых сайтах используйте системный cron или плагин WP Crontrol для мониторинга.
  • Неверно указаны условия в запросе заказов: например, параметр date_created требует форматирования, для сравнения используйте метод с фильтрами или кастомным SQL-запросом.
  • Конфликты с другими плагинами, меняющими статусы: проверяйте порядок выполнения хуков и при необходимости добавляйте приоритеты.
  • Изменение статуса приводит к зацикливанию событий: избегайте вызова функций смены статусов внутри хуков, которые их вызывают.

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

  • Ограничивайте выборку заказов для проверки, чтобы избежать долгих запросов — используйте пагинацию или выборку по дате создания;
  • Добавляйте логирование успешных и неудачных изменений для мониторинга;
  • Используйте транзиенты или кэширование, если логика сложная и требует частых проверок;
  • При интеграции с внешними сервисами оплаты реализуйте проверку статусов именно после подтверждения платежа, чтобы избежать ошибок;
  • Для сайтов с высокой нагрузкой рассмотрите системный cron вместо WP-Cron;
  • Тестируйте изменения на staging-среде перед продакшеном.

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

МетодПреимуществаНедостаткиПример
WP-Cron с периодической проверкойГибкость, работает без дополнительных плагиновЗависит от посещаемости сайта, может работать с задержкойКод выше с wp_schedule_event()
Хуки WooCommerce (например, payment_complete)Работает мгновенно при событии, меньше нагрузкиНе подходит для отложенных условийadd_action('woocommerce_payment_complete', ...)
Плагины автоматизации (например, AutomateWoo)Много готовых условий и действий, удобный интерфейсПлатные, добавляют нагрузкуПлагин с настройками визуального редактора
Как автоматически удалять неактивные вариации товаров в WooCommerce с помощью кода
07.05.2026
Как удалить неактивных пользователей WooCommerce с помощью кода
03.05.2026
Как автоматизировать создание alt-текста для изображений в WordPress
10.02.2026
Как создать персонализированные шорткоды в WordPress
08.11.2025
WooCommerce: автоматическое удаление неактивных вариаций товаров с помощью кода
26.05.2026