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

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

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

Диагностика проблемы

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

  • Откройте заказ в админке WooCommerce.
  • Измените способ доставки и сохраните заказ.
  • Проверьте, изменился ли статус заказа автоматически.

Если статус остался прежним, значит, нужны кастомные решения для автоматизации.

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

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

add_action('woocommerce_update_order', 'auto_change_order_status_on_shipping_change', 10, 1);function auto_change_order_status_on_shipping_change($order_id) {    if (!$order_id) {        return;    }    $order = wc_get_order($order_id);    if (!$order) {        return;    }    // Получаем предыдущий способ доставки из мета, если есть    $previous_shipping = get_post_meta($order_id, '_previous_shipping_method', true);    // Текущий способ доставки    $shipping_methods = $order->get_shipping_methods();    $current_shipping = '';$shipping_ids = array_keys($shipping_methods);    if (!empty($shipping_ids)) {        $current_shipping = $shipping_ids[0];    }    // Если способ доставки изменился    if ($previous_shipping !== $current_shipping) {        // Сохраняем новый способ доставки для последующей проверки        update_post_meta($order_id, '_previous_shipping_method', $current_shipping);        // Логика изменения статуса в зависимости от способа доставки        switch ($current_shipping) {            case 'flat_rate': // пример способа доставки                $order->update_status('on-hold', 'Статус изменён автоматически при смене способа доставки на фиксированную ставку');                break;            case 'free_shipping':                $order->update_status('processing', 'Статус изменён автоматически при смене способа доставки на бесплатную');                break;            // Добавьте другие способы доставки по необходимости            default:                // Не меняем статус                break;        }        $order->save();    }};

Обратите внимание, что в коде нужно заменить flat_rate и free_shipping на реальные ID способов доставки вашего магазина. Для проверки ID способов доставки можно посмотреть WC_Shipping_Method в разделе WooCommerce → Настройки → Доставка.

Как добавить поддержку нескольких способов доставки

Можно расширить условие, например, так:

case 'local_pickup':    $order->update_status('completed', 'Заказ готов к самовывозу');    break;

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

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

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

  • Неверные ID способов доставки: Для правильной работы нужно использовать точные ID способов доставки. Проверьте их через настройки WooCommerce или с помощью отладочного кода var_dump($order->get_shipping_methods()).
  • Отсутствие проверки на существование заказа: Проверяйте, что объект заказа успешно получен, иначе функция может вызвать ошибку.
  • Статус не меняется: Убедитесь, что хук woocommerce_update_order вызывается. Если нет, попробуйте использовать save_post_shop_order с дополнительной фильтрацией.
  • Бесконечный цикл обновления: Не забывайте сохранять текущий способ доставки в мета, чтобы избежать повторных изменений при каждом сохранении.

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

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

Сравнение способов решения задачи

МетодОписаниеПлюсыМинусы
Код на хуке woocommerce_update_orderАвтоматическое изменение статуса при обновлении заказаГибкость, без плагинов, легко кастомизируетсяТребует навыков PHP, возможны ошибки при неправильной логике
Плагин для автоматизации статусовГотовое решение с UIПростота установки, поддержкаМожет нагружать сайт, не всегда подходит под все кейсы
WooCommerce: автоматическое удаление заказов по срокам без плагинов
23.07.2026
WooCommerce: как изменить статус заказа через хуки и проверить работу
01.05.2026
Как настроить отложенный запуск задач в WordPress без использования WP-Cron
08.02.2026
Как использовать REST API в WordPress для создания собственных функций
13.11.2025
Как использовать WPCommunity для создания приватного форума в WordPress
12.03.2026