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

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

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

Для диагностики:

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

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

1. Отключение в настройках платежного шлюза

Некоторые шлюзы (например, Stripe, PayPal) имеют настройку автоматического подтверждения платежа. Проверьте настройки в WooCommerce > Настройки > Платежи и отключите автоматическое подтверждение, если есть такая опция.

2. Отключение через код — фильтры и хуки WooCommerce

Если настройки нет, можно перехватить смену статуса программно.

add_action('woocommerce_order_status_changed', 'prevent_auto_status_change', 10, 4);
function prevent_auto_status_change($order_id, $old_status, $new_status, $order) {
    // Список статусов, которые не должны устанавливаться автоматически
    $blocked_statuses = array('completed', 'processing');
    
    // Проверяем источник изменения, например, платежный шлюз
    if (in_array($new_status, $blocked_statuses)) {
        // Вернуть старый статус
        $order->set_status($old_status);
        $order->save();
    }
}

Этот код отменит любое автоматическое изменение статуса заказа на "completed" или "processing".

3. Отключение автоматического завершения заказа для конкретных платежных методов

Некоторые платежные шлюзы используют хук 'woocommerce_auto_complete_order'. Его можно отключить для конкретных методов:

add_filter('woocommerce_auto_complete_order', 'disable_auto_complete_for_specific_gateways', 10, 1);
function disable_auto_complete_for_specific_gateways($order_id) {
    $order = wc_get_order($order_id);
    $payment_method = $order->get_payment_method();
    
    // Список методов, для которых отключаем автообновление
    $blocked_gateways = array('stripe', 'paypal');
    
    if (in_array($payment_method, $blocked_gateways)) {
        return false; // Отключаем автоматическое завершение
    }
    return true;
}

Как проверить, что решение сработало

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

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

  • Код не работает, статус всё равно меняется: возможно, другой плагин или тема перезаписывает статус позже. Проверьте последовательность вызовов хуков и попробуйте увеличить приоритет (например, 999) в add_action.
  • Автоматическое обновление отключено для всех платежей: убедитесь, что в фильтр передаётся правильный список методов оплаты, чтобы не блокировать важные обновления.
  • Конфликты с кэшированием: при использовании плагинов кэширования очистите кэш после внесения изменений, иначе старые данные могут показываться.
  • Ошибка при сохранении заказа: проверьте, что объект $order корректно получен через wc_get_order() и что вызов $order->save() происходит без ошибок.

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

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

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

СпособПлюсыМинусыКогда использовать
Отключение в настройках шлюзаПростота, официальная поддержкаНе всегда доступноЕсли доступна настройка в плагине
Фильтр woocommerce_auto_complete_orderТочный контроль по методам оплатыТребует программированияКогда нужна гибкость и отключение для отдельных платежей
Хук woocommerce_order_status_changedМожно отменять любые изменения статусовМожет конфликтовать с другими плагинамиКогда нужно максимально жестко контролировать статусы
Как создать уникальные метаданные для каждого типа записей WordPress
16.01.2026
Как удалить версию WordPress из HTML и REST API для повышения безопасности
26.12.2025
WooCommerce: как полностью отключить отмену заказов через личный кабинет
21.05.2026
WooCommerce: как создать кастомный экспорт товаров в CSV без плагинов
15.05.2026
Обновление плагинов WordPress без потери настроек и конфликтов
05.12.2025