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

Почему автоматическое изменение статуса заказа важно в WooCommerce

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

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

Если при оплате заказа статус не меняется с «Ожидает оплаты» на «Обработан» или «Завершен», проверьте следующее:

  • Используется ли стандартный WooCommerce платежный шлюз или кастомный?
  • Обрабатывается ли платеж синхронно или есть задержка? Например, подтверждение оплаты по Webhook.
  • Есть ли ошибки в логах WooCommerce и сервера, связанные с изменением статуса?
  • Используются ли хуки, которые могут блокировать смену статуса (например, отмена перехода в определённых условиях)?

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

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

add_action('woocommerce_payment_complete', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);

    // Проверяем текущий статус
    if ($order->get_status() !== 'completed') {
        $order->update_status('completed', 'Статус автоматически изменён после оплаты.');
    }
}

Если нужно изменить статус на «обработан»:

add_action('woocommerce_payment_complete', 'custom_woocommerce_auto_processing_order');
function custom_woocommerce_auto_processing_order($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);

    if ($order->get_status() !== 'processing') {
        $order->update_status('processing', 'Статус автоматически изменён на обработку после оплаты.');
    }
}

Автоматическое обновление статуса для кастомных платежных шлюзов

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

function webhook_confirm_payment($order_id) {
    $order = wc_get_order($order_id);
    if ($order && $order->get_status() !== 'processing') {
        $order->update_status('processing', 'Оплата подтверждена через Webhook.');
    }
}

Привяжите эту функцию к обработчику Webhook вашего платежного шлюза.

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

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

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

  • Статус не меняется после оплаты
    Проверьте, срабатывает ли хук woocommerce_payment_complete или другой, соответствующий вашему платежному методу. Для кастомных шлюзов может потребоваться свой хук.
  • Конфликт с другими плагинами
    Отключите временно плагины, связанные с заказами и оплатой, чтобы исключить конфликт.
  • Неправильный статус
    Убедитесь, что используемый статус допустим для заказов WooCommerce (например, 'completed', 'processing', 'on-hold', 'cancelled').
  • Отсутствие прав для изменения статуса
    Проверьте, что код выполняется в контексте, где есть доступ к объекту заказа и его методам.

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

  • Всегда проверяйте, что $order_id передан и валиден перед изменением статуса.
  • Логируйте изменения статусов заказов для отладки и аудита.
  • При работе с Webhook проверяйте подписи и источник запроса, чтобы избежать подделки.
  • Избегайте частых вызовов update_status() без нужды — это может нагружать базу данных.
  • Тестируйте изменения на копии сайта, а не на живом магазине.

Сравнение способов реализации

СпособПлюсыМинусыПример использования
Хук woocommerce_payment_completeПростота, работает со стандартными шлюзамиНе подходит для асинхронных платежейАвтоматическое завершение заказа после оплаты
Обработка Webhook кастомного шлюзаПодходит для внешних и нестандартных платежейТребует отдельной проверки безопасности и логикиПодтверждение оплаты и смена статуса по событию
Ручной вызов update_status() из админки или скриптаГибкость, можно менять статус по условиюТребует вмешательства или дополнительного кодаАвтоматизация процессов с нестандартной логикой
WooCommerce: автоматическое отключение платежных методов при отказанном заказе
07.06.2026
Не работает обновление статуса заказа в WooCommerce: диагностика и решение
21.04.2026
Как создать производительный кэш в WordPress с применением Transients API
19.12.2025
WooCommerce: автоматическое создание заказа при оплате во внешней платежной системе
31.05.2026
WooCommerce: решение проблем с неотображением вариаций товаров
23.05.2026