wpcodes.ru wordpress WP Codеs

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

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

В WooCommerce часто возникает необходимость менять статус заказа не вручную, а автоматически по определённым условиям. Например, если заказ оплачен через конкретный метод оплаты, или когда товар на складе закончился, либо при выполнении пользовательской проверки. Без автоматизации приходится вручную отслеживать и менять статусы, что неэффективно и увеличивает риск ошибок.

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

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

Лучше всего подключиться к действию woocommerce_order_status_changed или woocommerce_thankyou для проверки состояния заказа и изменения статуса.

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

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

    // Проверяем метод оплаты
    if ($order->get_payment_method() === 'cod') { // Например, оплата при получении
        // Проверяем текущий статус
        if ($order->get_status() === 'pending') {
            // Меняем статус на processing
            $order->update_status('processing', 'Автоматическое обновление статуса по условию оплаты при получении.');
        }
    }
}

Этот код меняет статус заказов с «в ожидании» на «обрабатывается» для оплаты при получении (cod).

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

  • Оформите тестовый заказ с нужным способом оплаты.
  • Перейдите в админку WooCommerce > Заказы и откройте заказ.
  • Проверьте, что статус изменился автоматически на «обрабатывается».
  • Если не изменился — проверьте логи ошибок и подключение к нужному хуку.

Частые ошибки при автоматическом изменении статуса заказов

  • Хук срабатывает не в нужный момент: Некоторые хуки могут не подходить для проверки и изменения статуса — например, woocommerce_checkout_order_processed иногда вызывается слишком рано.
  • Неверная проверка условий: Проверяйте точные метод оплаты через $order->get_payment_method(), а не через название.
  • Отсутствие проверки статуса: Не забывайте проверять текущий статус заказа, чтобы избежать бесконечных циклов обновления.
  • Проблемы с правами: Функция update_status требует, чтобы заказ был корректно загружен и доступен.

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

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

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

МетодХук / событиеПлюсыМинусы
woocommerce_thankyouПосле завершения оформления заказаПростота, доступ к заказу после оплатыНе срабатывает для всех статусов, не подходит для отмен
woocommerce_order_status_changedПри смене статуса заказаГибкость, можно реагировать на любые статусыТребует дополнительной логики, чтобы избежать циклов
woocommerce_checkout_order_processedПосле оформления заказаРанний этап, можно отменить или изменить данныеСтатус может ещё не быть установлен

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

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

    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if (!$product) continue;

        // Проверяем наличие на складе
        if ($product->get_stock_quantity() <= 0) {
            // Меняем статус заказа на on-hold (ожидает оплаты)
            $order->update_status('on-hold', 'Товар отсутствует на складе, ожидание пополнения.');
            return;
        }
    }
}
×

Создай идеальный сайт – теперь на 15% дешевле!

Подобрать тему →