Диагностика проблемы: заказ не меняет статус после оплаты
В WooCommerce стандартно статус заказа меняется автоматически, если выбран поддерживаемый способ оплаты и он корректно интегрирован. Но при использовании кастомных шлюзов, нестандартных платежных систем или ручных платежей часто возникает ситуация, когда заказ после успешной оплаты остаётся в статусе pending или on-hold. Это мешает автоматизации, усложняет учёт и доставку.
Как проверить статус заказа и его изменение?
- В админке WooCommerce перейдите в Заказы и откройте конкретный заказ.
- Посмотрите на текущий статус заказа (например,
processing,completed,pending). - Сделайте тестовый заказ и оплатите его через проблемный способ оплаты.
- Если статус не меняется автоматически, значит интеграция с оплатой не срабатывает корректно.
Пошаговое решение: автоматическое изменение статуса при успешной оплате
Для исправления ситуации нужно добавить обработчик события успешной оплаты и программно обновить статус заказа. Вот пример для стандартного хука woocommerce_payment_complete, который вызывается при успешной оплате:
add_action('woocommerce_payment_complete', 'custom_change_order_status_on_payment', 10, 1);
function custom_change_order_status_on_payment($order_id) {
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
// Проверяем текущий статус, чтобы избежать лишних изменений
if ($order->get_status() === 'pending' || $order->get_status() === 'on-hold') {
// Меняем статус на processing (обычно для оплаченных заказов с доставкой)
$order->update_status('processing', 'Статус автоматически изменён после успешной оплаты');
}
}Если вы используете кастомный платежный шлюз, нужно убедиться, что он вызывает функцию $order->payment_complete() после подтверждения оплаты. Если такого вызова нет, добавьте его в код шлюза.
Пример вызова payment_complete в кастомном шлюзе
public function process_payment($order_id) {
$order = wc_get_order($order_id);
// ... ваш код обработки платежа и подтверждения ...
$order->payment_complete();
return array(
'result' => 'success',
'redirect' => $this->get_return_url($order),
);
}Проверка результата после внедрения
- Создайте тестовый заказ с выбранным способом оплаты.
- Оплатите заказ (можно использовать тестовый режим платежного шлюза).
- Перейдите в админку WooCommerce, откройте заказ и убедитесь, что статус изменился на
processingили другой необходимый. - Проверьте логи WooCommerce (WooCommerce > Статус > Логи) на наличие ошибок.
Частые ошибки и как их исправить
- Хук не срабатывает: убедитесь, что используемый платежный шлюз действительно вызывает
woocommerce_payment_completeили$order->payment_complete(). Если нет — добавьте вызов вручную. - Статус не меняется из-за кеширования: отключите кеширование страниц или исключите страницы заказа из кеша.
- Конфликт плагинов: временно отключите другие плагины, чтобы убедиться, что они не перезаписывают статус заказа.
- Неправильный статус: используйте только статусы, поддерживаемые WooCommerce:
pending,processing,completed,on-hold,cancelled,refunded,failed.
Практические советы по безопасности и производительности
- Не используйте глобальные хуки без проверки ID заказа и статуса — это может вызвать нежелательные изменения.
- Логируйте изменения статусов в отдельный лог-файл для диагностики (можно использовать
error_log()или плагины для логирования). - Избегайте выполнения тяжелых операций в хуках оплаты, чтобы не замедлять процесс оформления.
- Регулярно обновляйте WooCommerce и платежные шлюзы для совместимости и безопасности.
Сравнение вариантов автоматического изменения статуса заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_payment_complete | Использование встроенного хука для смены статуса | Простота, надежность, поддержка WooCommerce | Требует, чтобы шлюз вызывал событие |
Вызов $order->payment_complete() в коде платежного шлюза | Программный вызов изменения статуса | Гарантирует смену статуса сразу после оплаты | Требует редактирования кода платежного шлюза |
| Использование плагинов автоматизации | Плагины для управления статусами заказов | Удобство, визуальный интерфейс | Зависимость от стороннего ПО, нагрузка |