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

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

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

Для диагностики запустите следующий код в консоли браузера на странице «Заказы» в админке, чтобы понять, какие хуки срабатывают при обновлении заказа:

jQuery(document).ajaxComplete(function(event, xhr, settings) {
    if (settings.url.indexOf('wc-ajax=update_order_status') !== -1) {
        console.log('Обновление статуса заказа:', settings.data);
    }
});

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

Пошаговое решение: отключаем автоматическое обновление статусов заказов в WooCommerce

1. Отключение автоматических хуков обновления статусов

WooCommerce использует несколько хуков, которые отвечают за смену статуса, например, woocommerce_payment_complete и woocommerce_order_status_completed. Чтобы отключить автоматическую смену, нужно убрать связанные с ними обработчики.

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

remove_action('woocommerce_payment_complete', array(WC()->payment_gateways(), 'payment_complete'));
remove_action('woocommerce_order_status_completed', 'wc_order_complete');

Этот пример универсален, но конкретные функции могут отличаться в зависимости от используемых платежных шлюзов. Рекомендуется проверить код шлюзов в /wp-content/plugins/woocommerce-gateway-*.

2. Отключение автоматических смен статусов в платежных шлюзах

Многие шлюзы (например, PayPal, Stripe) сами обновляют статусы. Для отключения автоматического обновления в их настройках ищите опцию, например, «Автоматически менять статус заказа» и отключайте её.

Если опции нет, можно перехватить обработчик следующим образом:

add_filter('woocommerce_payment_complete_order_status', function($status, $order_id) {
    // Принудительно оставляем статус 'processing' для всех заказов
    return 'processing';
}, 10, 2);

3. Внедрение ручного управления статусами

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

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

  • Создайте тестовый заказ с использованием разных способов оплаты.
  • Убедитесь, что статус заказа не меняется автоматически после оплаты.
  • Попробуйте сменить статус вручную через админку.
  • Проверьте, что в базе данных в таблице wp_posts для заказа поле post_status меняется только при вашем действии.

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

  • Ошибка: Статус все равно меняется автоматически после оплаты.
    Причина: Платежный шлюз использует свои внутренние обработчики.
    Решение: Проверьте документацию шлюза и отключите автоматическое обновление статуса в его настройках или перехватите фильтр woocommerce_payment_complete_order_status.
  • Ошибка: Код не работает, сайт выдает ошибку PHP.
    Причина: Некорректное использование функций или хуков.
    Решение: Убедитесь, что используете remove_action после подключения WooCommerce, например, в хук init с приоритетом 20:
add_action('init', function() {
    remove_action('woocommerce_payment_complete', array(WC()->payment_gateways(), 'payment_complete'));
}, 20);

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

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

Сравнение вариантов отключения автоматического обновления статусов WooCommerce

ВариантСпособ реализацииПлюсыМинусы
Отключение через remove_actionPHP-код в functions.phpГибко, без плагиновТребует технических знаний
Настройки платежного шлюзаЧерез админку WooCommerceПросто, без кодаНе во всех шлюзах доступно
Перехват фильтра woocommerce_payment_complete_order_statusPHP-код, возвращает нужный статусКонтроль над статусомМожет конфликтовать с плагинами
WooCommerce: как исключить товар из каталога и поиска без удаления
01.06.2026
Как создать динамические таблицы в WordPress с помощью AJAX
21.02.2026
Как добавить уникальные поля в WooCommerce без плагинов
23.12.2025
Как изменить функции WooCommerce без изменения основных файлов WordPress
18.11.2025
WooCommerce: как использовать фильтр hook для изменения цены товаров динамически
26.04.2026