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

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

В стандартной работе WooCommerce при успешной оплате заказ автоматически переводится в статус "обработан" (processing) или "завершен" (completed), в зависимости от настроек и типа товара. Однако иногда возникает ситуация, когда статус не меняется автоматически, что мешает дальнейшей обработке заказов.

Основные признаки проблемы:

  • Клиент оплатил заказ, но статус остается "в ожидании оплаты" (pending)
  • Автоматические email-уведомления о смене статуса не отправляются
  • Ручное изменение статуса работает, автоматическое — нет

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

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

1. Проверка поддержки вебхуков платежного шлюза

Убедитесь, что ваш платежный шлюз отправляет уведомления (webhook) о завершении оплаты. Без этого WooCommerce не узнает, что заказ оплачен.

2. Использование хука woocommerce_payment_complete для смены статуса

Если платежный шлюз не меняет статус автоматически, можно вручную обработать событие оплаты, используя хук woocommerce_payment_complete. Например, чтобы переводить заказ в статус completed сразу после оплаты:

add_action('woocommerce_payment_complete', 'custom_change_order_status_after_payment');
function custom_change_order_status_after_payment( $order_id ) {
    if ( ! $order_id ) return;
    $order = wc_get_order( $order_id );
    if ( $order->get_status() !== 'completed' ) {
        $order->update_status('completed', 'Статус обновлен автоматически после оплаты.');
    }
}

3. Альтернатива: смена статуса с учетом типа товара

Если у вас смешанные типы товаров, и для цифровых нужно сразу ставить completed, а для физических — processing, используйте проверку товаров в заказе:

add_action('woocommerce_payment_complete', 'custom_status_by_product_type');
function custom_status_by_product_type( $order_id ) {
    $order = wc_get_order( $order_id );
    $has_physical = false;
    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        if ( $product && ! $product->is_virtual() ) {
            $has_physical = true;
            break;
        }
    }
    $new_status = $has_physical ? 'processing' : 'completed';
    if ( $order->get_status() !== $new_status ) {
        $order->update_status( $new_status, 'Автоматическое обновление статуса заказа после оплаты');
    }
}

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

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

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

  • Хук не срабатывает: Проверьте, что платежный шлюз корректно сообщает WooCommerce об оплате (webhook или IPN настроены).
  • Статус меняется неверно: Проверьте условие в коде, особенно если используете проверки товаров. Ошибки логики могут приводить к неправильному статусу.
  • Конфликт с другими плагинами: Отключите временно все дополнительные плагины, кроме WooCommerce, чтобы проверить влияние.
  • Кэширование блокирует обновление: Очистите кэш сайта и браузера, отключите кэширование на время тестов.

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

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

Сравнение вариантов решения задачи

МетодОписаниеПлюсыМинусы
Встроенная поддержка платежного шлюзаАвтоматическая смена статуса через webhookПростота, надежностьЗависит от качества плагина шлюза
Хук woocommerce_payment_completeКастомный код для смены статуса после оплатыГибкость, контроль логикиТребует разработки и тестирования
Ручное изменение статусаАдмин меняет статус вручнуюПростотаЗатратно по времени, риск ошибок
Как установить и настроить WPRemark для расширенного комментирования в WordPress
19.02.2026
Как удалить заблокированные сессии пользователей в WordPress через код
11.03.2026
Как создать собственную таблицу в WordPress без плагинов
03.12.2025
Реактивный фильтрованный вывод постов в WordPress с AJAX
20.03.2026
Как удалить неиспользуемые метаполя в WordPress с помощью кода
30.03.2026