Диагностика проблемы: заказ в WooCommerce не меняет статус автоматически
Частая ситуация в WooCommerce — платёж прошёл успешно, но статус заказа остаётся в «В ожидании оплаты» или «Обработка», что мешает дальнейшей автоматизации и уведомлениям. Это особенно критично при использовании сторонних платёжных шлюзов или кастомных API, где стандартные хуки WooCommerce могут не срабатывать.
Чтобы убедиться, что проблема именно в автоматическом обновлении статуса, проверьте следующие моменты:
- Статус заказа после оплаты не меняется, хотя платёж подтверждён в системе платёжного провайдера.
- Платёжный шлюз не вызывает стандартный хук
woocommerce_payment_completeили аналогичный. - Отсутствуют уведомления клиенту и менеджеру о смене статуса.
Пошаговое решение: программное изменение статуса заказа после успешного платежа
1. Использование хука woocommerce_thankyou для обработки успешного платежа
Для гарантированного обновления статуса можно ловить событие отображения страницы благодарности после оплаты и программно менять статус заказа.
add_action('woocommerce_thankyou', 'auto_change_order_status_after_payment', 10, 1);
function auto_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') return;
// Проверяем, что оплата прошла
if ($order->is_paid()) {
// Меняем статус на completed (выполнен)
$order->update_status('completed', 'Автоматическое обновление статуса после успешного платежа');
}
}2. Дополнительная проверка по метаданным платежа
Если у вас есть кастомные метаданные или особенности платежного шлюза, можно добавить их проверку:
add_action('woocommerce_thankyou', 'custom_auto_update_order_status', 10, 1);
function custom_auto_update_order_status($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$payment_method = $order->get_payment_method();
// Пример: для определённого шлюза проверяем метаданные
if ($payment_method === 'custom_gateway') {
$paid_meta = $order->get_meta('_custom_payment_status');
if ($paid_meta === 'paid' && $order->get_status() !== 'completed') {
$order->update_status('completed', 'Статус обновлен по кастомному шлюзу');
}
}
}Проверка результата после внедрения
Чтобы убедиться, что автоматическое обновление статуса работает корректно:
- Оформите тестовый заказ и пройдите процесс оплаты через ваш платёжный шлюз.
- После успешной оплаты перейдите на страницу благодарности — проверьте, изменился ли статус заказа в админке WooCommerce на «Выполнен» (completed) или нужный вам.
- Проверьте логи WooCommerce или включите отладку
define('WP_DEBUG', true);вwp-config.phpдля выявления ошибок. - Убедитесь, что клиент и менеджер получают уведомления при смене статуса, если это настроено.
Частые ошибки и как их исправить
- Хук не срабатывает: Возможно, платёжный шлюз не перенаправляет на страницу благодарности или использует AJAX. В этом случае используйте другие хуки, например,
woocommerce_payment_completeили собственные API-шлюза. - Статус не меняется: Проверьте, что вы вызываете
$order->update_status()корректно и без ошибок. Убедитесь, что объект$orderполучен правильно. - Неправильный статус: WooCommerce поддерживает ограниченный набор статусов. Используйте допустимые:
pending,processing,completed,on-holdи др. - Конфликты с плагинами: Некоторые плагины могут переписывать логику статусов. Отключите временно остальные плагины для теста.
Практические советы по безопасности и производительности
- Используйте проверки
if (!$order_id) return;иif (!$order) return;, чтобы избежать ошибок PHP. - Не меняйте статус без проверки оплаты — иначе можно случайно завершить неоплаченный заказ.
- Для массовых заказов и импорта используйте WP-CLI или отдельные скрипты, чтобы не нагружать сайт на каждом запросе.
- В логах фиксируйте изменение статусов для аудита и отладки.
Сравнение подходов автоматического обновления статуса заказа
| Способ | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Хук woocommerce_thankyou | Прост в реализации, срабатывает после оплаты | Не работает если нет перехода на страницу спасибо | Для сайтов с классическим оформлением заказа |
Хук woocommerce_payment_complete | Срабатывает сразу после оплаты, универсален | Некоторые шлюзы не вызывают этот хук | Лучше для интеграций с поддержкой WooCommerce |
| Кастомные проверки метаданных | Гибко подстраивается под любой шлюз | Требует знания структуры данных платежа | При использовании нестандартных шлюзов |