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

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

По умолчанию WooCommerce не изменяет статус заказа, если пользователь или администратор меняет способ доставки после оформления. Это может приводить к ошибкам в логистике, если, например, выбранный способ доставки требует подтверждения или дополнительных действий.

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

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

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

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

  • Через админку в заказах
  • Через пользовательский профиль (если предусмотрено)
  • Через API или сторонние плагины

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

Пошаговое решение: добавляем обработку в functions.php

Ниже приведён пример кода, который отслеживает изменение способа доставки и меняет статус заказа на on-hold (ожидает подтверждения) при смене способа доставки:

add_action('woocommerce_process_shop_order_meta', 'wpteam_check_shipping_change_and_update_status', 20, 2);
function wpteam_check_shipping_change_and_update_status($post_id, $post){
    $order = wc_get_order($post_id);
    if(!$order) return;

    // Получаем старые способы доставки из мета
    $old_shipping_methods = get_post_meta($post_id, '_old_shipping_methods', true);
    
    // Получаем текущие способы доставки
    $current_shipping_methods = array();
    foreach($order->get_shipping_methods() as $shipping_item){
        $current_shipping_methods[] = $shipping_item->get_method_id();
    }

    // Сравниваем старые и новые
    if($old_shipping_methods && $old_shipping_methods !== $current_shipping_methods){
        // Меняем статус заказа
        $order->update_status('on-hold', 'Статус изменён автоматически из-за смены способа доставки');
    }

    // Обновляем мета на текущие методы для следующей проверки
    update_post_meta($post_id, '_old_shipping_methods', $current_shipping_methods);
}

Объяснение: при каждом сохранении заказа код сравнивает текущие способы доставки с теми, что были при предыдущем сохранении. Если они отличаются, статус меняется на on-hold. Чтобы первый раз сохранить способ доставки, используется метаполе _old_shipping_methods.

Как внедрить

  1. Открыть functions.php вашей дочерней темы или подключаемого плагина.
  2. Вставить код выше.
  3. Сохранить файл.
  4. Открыть любой заказ в админке WooCommerce.
  5. Изменить способ доставки и сохранить заказ.

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

Чтобы проверить, что код сработал:

  • Откройте существующий заказ с любым статусом, например processing.
  • Измените способ доставки и сохраните заказ.
  • Проверьте, что статус заказа изменился на on-hold.
  • В разделе комментариев к заказу появится запись «Статус изменён автоматически из-за смены способа доставки».

Если статус не изменился — проверьте логи ошибок и убедитесь, что код активен и нет конфликтов с другими плагинами.

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

  • Код не срабатывает при смене доставки: возможно, способ доставки меняется не через админку, а программно. В этом случае нужно расширить обработку, например, через хук woocommerce_order_edit_status или кастомные события.
  • Ошибка в коде PHP: проверьте синтаксис, используйте error_log для отладки.
  • Мета _old_shipping_methods не создаётся: при первом сохранении заказа мета будет пустой, что нормально. При следующем сохранении сравнение уже будет работать.
  • Проблемы с правами доступа: убедитесь, что пользователь админки имеет право редактировать заказы.

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

  • Код не влияет на фронтенд, поэтому проблем с производительностью быть не должно.
  • Сохраняйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
  • Не меняйте статус на критический (например, cancelled) без проверки бизнес-логики.
  • Добавьте проверку текущего статуса перед сменой, чтобы не менять статус, если это не нужно.

Альтернативные решения: плагин или код

СпособПлюсыМинусы
Код в functions.phpЛёгкая кастомизация, нет лишних плагиновТребует навыков программирования, поддержка на вас
Плагин для управления статусами заказовПростота настройки, расширенный функционалМожет быть избыточным, нагрузка, конфликт с другими плагинами
Удаление всех записей определённой таксономии в WordPress
29.12.2025
Как создать производительный кэш в WordPress с применением Transients API
19.12.2025
Как удалить кэш transient в WordPress для решения проблем с устаревшими данными
11.02.2026
Динамическая фильтрация таксономий в WordPress: решение и примеры кода
10.12.2025
Решение проблемы: не работает обновление статуса заказа в WooCommerce
24.04.2026