Диагностика проблемы: почему статус заказа не меняется после оплаты
В WooCommerce по умолчанию статус заказа автоматически меняется после успешной оплаты, но иногда возникает необходимость изменить этот статус на кастомный или нестандартный, например, сразу переводить заказ в статус "в обработке" или "завершён". Это особенно актуально при использовании нестандартных платёжных шлюзов или кастомных бизнес-процессов.
Проверьте, какой статус выставляется по умолчанию и как работает ваш платёжный шлюз:
- Перейдите в WooCommerce > Заказы и посмотрите статусы последних оплаченных заказов.
- Проверьте логи платёжного шлюза (если есть) и статус транзакции.
- Убедитесь, что хук
woocommerce_payment_completeсрабатывает.
Пошаговое решение: изменение статуса заказа после оплаты
Для изменения статуса заказа сразу после успешной оплаты используйте хук woocommerce_payment_complete, который вызывается после завершения оплаты. Добавьте следующий код в файл 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;
// Установим нужный статус, например 'processing' или 'completed'
$new_status = 'processing';
// Проверяем текущий статус, чтобы избежать лишних изменений
if ($order->get_status() !== $new_status) {
$order->update_status($new_status, 'Статус изменен автоматически после оплаты.');
}
}В примере выше заказ переводится в статус processing после оплаты. Вы можете заменить processing на любой другой статус, например completed, если нужно сразу закрывать заказ.
Дополнительная проверка статуса оплаты
Если вы хотите менять статус в зависимости от метода оплаты, можно добавить проверку:
add_action('woocommerce_payment_complete', 'custom_change_order_status_based_on_payment_method');
function custom_change_order_status_based_on_payment_method($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$payment_method = $order->get_payment_method();
if ($payment_method === 'cheque') { // пример для метода оплаты 'чек'
$order->update_status('on-hold', 'Статус изменен для метода "Чек" после оплаты.');
} else {
$order->update_status('processing', 'Статус изменен автоматически после оплаты.');
}
}Проверка результата после внедрения
- Создайте тестовый заказ и оплатите его через нужный способ оплаты.
- Перейдите в WooCommerce > Заказы и проверьте статус заказа.
- В админке у заказа должна появиться заметка с комментарием, добавленным функцией.
- Если статус не изменился, проверьте логи ошибок PHP и включите WP_DEBUG для отладки.
Частые ошибки и как их исправить
- Код не срабатывает: Проверьте, что код добавлен в правильное место и сайт не кеширует старый вариант. Отключите кэширование.
- Статус не меняется: Убедитесь, что хук
woocommerce_payment_completeдействительно вызывается. Для этого можно временно добавитьerror_log()внутри функции. - Неправильный статус: Используйте только существующие статусы WooCommerce:
pending,processing,on-hold,completed,cancelled,refunded,failed. - Конфликты с плагинами: Отключите плагины, которые также могут менять статус заказов, например, кастомные шлюзы или автоматические обработчики.
Практические советы по безопасности и производительности
- Не используйте тяжелые операции или запросы к внешним сервисам внутри хука
woocommerce_payment_complete, так как это может замедлить обработку заказа. - Всегда проверяйте валидность объекта заказа перед изменением статуса.
- Для сложных сценариев используйте асинхронную обработку через WP Cron или очереди задач.
- При добавлении кастомных статусов создавайте их через
register_post_status, чтобы избежать конфликтов с ядром WooCommerce.
Сравнение подходов: код vs плагины
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Полный контроль, нет лишних зависимостей, легкая кастомизация | Требует знаний PHP, риск ошибок, может сломаться при обновлениях |
| Плагины для автоматизации статусов (например, AutomateWoo) | Простой интерфейс, много настроек, поддержка разработчиков | Дополнительная нагрузка, необходимость обновлений, может быть платным |