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

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

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

Для диагностики проблемы проверьте следующие моменты:

  • Используется ли стандартный шлюз оплаты WooCommerce или сторонний плагин?
  • Есть ли обработчик события оплаты, который меняет статус заказа?
  • В логе WooCommerce или плагина платежного шлюза нет ошибок?
  • Не блокирует ли смену статуса какой-либо кастомный код или плагин безопасности?

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

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

Добавление кода в functions.php темы или в кастомный плагин

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) {
        return;
    }

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

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

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

Чтобы убедиться, что код работает корректно, выполните следующие шаги:

  1. Создайте тестовый заказ в магазине и оплатите его через выбранный способ оплаты.
  2. Перейдите в админку WooCommerce → Заказы и проверьте статус заказа.
  3. Если статус изменился на completed (или тот, что вы задали), значит код работает.
  4. Дополнительно проверьте, что в комментариях заказа появилось сообщение Статус изменен автоматически после оплаты.

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

  • Заказ не меняет статус после оплаты
    Проверьте, вызывается ли хук woocommerce_payment_complete вашим платежным шлюзом. Некоторые шлюзы используют другие хуки или требуют ручного подтверждения.
  • Код не работает, потому что $order_id пустой или неправильный
    Убедитесь, что функция получает правильный ID заказа. Иногда нужно использовать другие хуки, например woocommerce_thankyou.
  • Статус меняется, но заказ не считается оплаченным
    Иногда требуется дополнительно обновить мета-данные заказа или убедиться, что платежный шлюз корректно завершает транзакцию.
  • Конфликт с другими плагинами
    Отключите сторонние плагины безопасности или кэширования и проверьте работу функции.

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

  • Добавляйте подобный код в дочернюю тему или кастомный плагин, чтобы не потерять при обновлении.
  • Не делайте смену статуса на completed, если требуется ручная проверка заказа — используйте processing.
  • Логируйте изменения статусов через error_log или системный лог для отладки в продакшене.
  • Проверяйте совместимость с используемыми платежными шлюзами и обновляйте код при их обновлениях.

Сравнение способов автоматической смены статуса заказа

СпособПлюсыМинусы
Хук woocommerce_payment_completeНативное решение, срабатывает на большинстве шлюзовНе все шлюзы его вызывают
Хук woocommerce_thankyouВызывается на странице благодарности, можно проверить вручнуюНе всегда означает успешную оплату (например, при офлайн оплате)
Обработка вебхуков платежного шлюзаСамый надежный способ подтверждения оплатыТребует разработки и настройки интеграции
Динамическая фильтрация таксономий в WordPress: решение и примеры кода
10.12.2025
Как создать выбор по динамическим таксономиям в WordPress
02.03.2026
Как использовать WPCommunity для создания приватного форума в WordPress
12.03.2026
Как использовать AJAX в WordPress для динамического обновления контента
03.12.2025
Как создать производительный кэш в WordPress с применением Transients API
19.12.2025