Диагностика проблемы: заказ не меняет статус автоматически после оплаты
В стандартной установке WooCommerce после успешной оплаты заказ переходит в статус processing или completed (в зависимости от типа товара и способа оплаты). Однако бывают ситуации, когда требуется изменить статус заказа на кастомный, например, awaiting_shipment или custom_completed сразу после подтверждения оплаты. При этом стандартные настройки не позволяют это сделать без вмешательства.
Часто пользователи сталкиваются с тем, что заказ остается в статусе processing или on-hold, хотя оплата прошла успешно, и автоматическая смена статуса не происходит. Это может негативно повлиять на логику обработки заказа и вызвать задержки.
Как определить, что статус заказа не меняется автоматически
- В административной панели WooCommerce в разделе Заказы заказ после оплаты не меняет статус
- Покупатель получает уведомление с неправильным статусом заказа
- Логи платежной системы подтверждают успешную оплату, но в WooCommerce заказ не обновляется
Пошаговое решение: используем хук woocommerce_payment_complete
WooCommerce предоставляет хук 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;
}
// Проверяем текущий статус для безопасности
if ($order->get_status() === 'processing') {
// Устанавливаем новый статус, например, 'awaiting-shipment'
$order->update_status('awaiting-shipment', 'Статус автоматически изменен после оплаты.');
}
}
В этом примере заказ со статусом processing сменится на awaiting-shipment. Если такого статуса нет в списке WooCommerce, его необходимо зарегистрировать (см. следующий раздел).
Регистрация пользовательского статуса заказа
Для добавления нового статуса awaiting-shipment используйте следующий код:
add_filter('wc_order_statuses', 'add_custom_order_statuses');
function add_custom_order_statuses($order_statuses) {
$order_statuses['wc-awaiting-shipment'] = _x('Ожидает отправки', 'Order status', 'your-textdomain');
return $order_statuses;
}
add_action('init', 'register_custom_order_status');
function register_custom_order_status() {
register_post_status('wc-awaiting-shipment', array(
'label' => 'Ожидает отправки',
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Ожидает отправки <span class="count">(%s)</span>', 'Ожидает отправки <span class="count">(%s)</span>', 'your-textdomain')
));
}
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce и оплатите его через выбранный платежный шлюз
- После успешной оплаты проверьте, что статус заказа изменился на
Ожидает отправки(или на ваш кастомный статус) в админке WooCommerce - Убедитесь, что в комментариях к заказу появилась запись с сообщением о смене статуса
- Проверьте e-mail уведомления, если вы их настроили на ваш кастомный статус заказа
Частые ошибки и как их исправить
- Код не работает и статус не меняется: проверьте, что функция подключена корректно и хук
woocommerce_payment_completeсрабатывает. Можно временно добавитьerror_log()внутри функции для отладки. - Кастомный статус не отображается в списках: убедитесь, что вы зарегистрировали статус через
register_post_statusи добавили его вwc_order_statuses. - Платежная система не вызывает хук: некоторые шлюзы используют собственные механизмы. В этом случае используйте хук, который специфичен для вашего платежного шлюза, например,
woocommerce_order_status_completed. - Статус меняется некорректно для всех заказов: добавьте дополнительные проверки внутри функции, например, по способу оплаты или продуктам в заказе.
Практические советы по безопасности и производительности
- Всегда проверяйте наличие
$orderи$order_idперед вызовом методов, чтобы избежать фатальных ошибок. - Не используйте тяжелую логику внутри хука оплаты, чтобы не замедлять процесс оформления заказа.
- Для сложных условий фильтруйте заказы по мета-данным, способам оплаты или другим параметрам.
- Для отладки используйте WP_DEBUG и
error_log, чтобы отслеживать работу ваших функций.
Сравнение вариантов реализации изменения статуса заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_payment_complete |
Изменение статуса сразу после успешной оплаты | Простота, срабатывает для большинства шлюзов | Некоторые платежи могут не вызывать хук |
Хук woocommerce_order_status_changed |
Отслеживание смены статуса заказа с дополнительной логикой | Гибкость, подходит для кастомных сценариев | Может сработать не сразу после оплаты |
| Плагин для автоматизации (например, Clearfy Pro) | Готовые настройки для смены статусов и автоматизации | Удобство, меньше кода | Зависимость от стороннего ПО, потенциальные расходы |