Диагностика проблемы: статус заказа не меняется после оплаты
В стандартной работе 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 | Кастомный код для смены статуса после оплаты | Гибкость, контроль логики | Требует разработки и тестирования |
| Ручное изменение статуса | Админ меняет статус вручную | Простота | Затратно по времени, риск ошибок |