Диагностика проблемы: заказ не меняет статус после оплаты
В 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.
Проверка результата после внедрения
Чтобы убедиться, что код работает корректно, выполните следующие шаги:
- Создайте тестовый заказ в магазине и оплатите его через выбранный способ оплаты.
- Перейдите в админку WooCommerce → Заказы и проверьте статус заказа.
- Если статус изменился на
completed(или тот, что вы задали), значит код работает. - Дополнительно проверьте, что в комментариях заказа появилось сообщение Статус изменен автоматически после оплаты.
Частые ошибки и их исправление
- Заказ не меняет статус после оплаты
Проверьте, вызывается ли хукwoocommerce_payment_completeвашим платежным шлюзом. Некоторые шлюзы используют другие хуки или требуют ручного подтверждения. - Код не работает, потому что $order_id пустой или неправильный
Убедитесь, что функция получает правильный ID заказа. Иногда нужно использовать другие хуки, напримерwoocommerce_thankyou. - Статус меняется, но заказ не считается оплаченным
Иногда требуется дополнительно обновить мета-данные заказа или убедиться, что платежный шлюз корректно завершает транзакцию. - Конфликт с другими плагинами
Отключите сторонние плагины безопасности или кэширования и проверьте работу функции.
Практические советы по безопасности и производительности
- Добавляйте подобный код в дочернюю тему или кастомный плагин, чтобы не потерять при обновлении.
- Не делайте смену статуса на
completed, если требуется ручная проверка заказа — используйтеprocessing. - Логируйте изменения статусов через
error_logили системный лог для отладки в продакшене. - Проверяйте совместимость с используемыми платежными шлюзами и обновляйте код при их обновлениях.
Сравнение способов автоматической смены статуса заказа
| Способ | Плюсы | Минусы |
|---|---|---|
Хук woocommerce_payment_complete | Нативное решение, срабатывает на большинстве шлюзов | Не все шлюзы его вызывают |
Хук woocommerce_thankyou | Вызывается на странице благодарности, можно проверить вручную | Не всегда означает успешную оплату (например, при офлайн оплате) |
| Обработка вебхуков платежного шлюза | Самый надежный способ подтверждения оплаты | Требует разработки и настройки интеграции |