Диагностика проблемы: почему WooCommerce меняет статус заказов автоматически
В стандартной установке WooCommerce некоторые платежные шлюзы или сторонние плагины могут автоматически менять статус заказа (например, с "в обработке" на "завершён") после получения оплаты. Это нередко вызывает проблемы, если вы хотите вручную проверять и подтверждать заказы перед отправкой.
Для диагностики:
- Проверьте, какие плагины отвечают за обработку платежей.
- Посмотрите логи WooCommerce (WooCommerce > Статус > Логи) на предмет автоматических изменений статусов.
- Включите отладку WooCommerce для подробного анализа.
Пошаговое решение: отключаем автоматическое обновление статусов заказов
1. Отключение в настройках платежного шлюза
Некоторые шлюзы (например, Stripe, PayPal) имеют настройку автоматического подтверждения платежа. Проверьте настройки в WooCommerce > Настройки > Платежи и отключите автоматическое подтверждение, если есть такая опция.
2. Отключение через код — фильтры и хуки WooCommerce
Если настройки нет, можно перехватить смену статуса программно.
add_action('woocommerce_order_status_changed', 'prevent_auto_status_change', 10, 4);
function prevent_auto_status_change($order_id, $old_status, $new_status, $order) {
// Список статусов, которые не должны устанавливаться автоматически
$blocked_statuses = array('completed', 'processing');
// Проверяем источник изменения, например, платежный шлюз
if (in_array($new_status, $blocked_statuses)) {
// Вернуть старый статус
$order->set_status($old_status);
$order->save();
}
}Этот код отменит любое автоматическое изменение статуса заказа на "completed" или "processing".
3. Отключение автоматического завершения заказа для конкретных платежных методов
Некоторые платежные шлюзы используют хук 'woocommerce_auto_complete_order'. Его можно отключить для конкретных методов:
add_filter('woocommerce_auto_complete_order', 'disable_auto_complete_for_specific_gateways', 10, 1);
function disable_auto_complete_for_specific_gateways($order_id) {
$order = wc_get_order($order_id);
$payment_method = $order->get_payment_method();
// Список методов, для которых отключаем автообновление
$blocked_gateways = array('stripe', 'paypal');
if (in_array($payment_method, $blocked_gateways)) {
return false; // Отключаем автоматическое завершение
}
return true;
}Как проверить, что решение сработало
- Создайте тестовый заказ через платежный шлюз, для которого вы отключили автообновление.
- После оплаты статус заказа должен остаться в "в обработке" или другом ожидаемом статусе, а не смениться на "завершён".
- Проверьте логи WooCommerce на отсутствие автоматических обновлений.
- Попробуйте вручную изменить статус заказа и убедитесь, что это работает без ошибок.
Частые ошибки и как их исправить
- Код не работает, статус всё равно меняется: возможно, другой плагин или тема перезаписывает статус позже. Проверьте последовательность вызовов хуков и попробуйте увеличить приоритет (например, 999) в
add_action. - Автоматическое обновление отключено для всех платежей: убедитесь, что в фильтр передаётся правильный список методов оплаты, чтобы не блокировать важные обновления.
- Конфликты с кэшированием: при использовании плагинов кэширования очистите кэш после внесения изменений, иначе старые данные могут показываться.
- Ошибка при сохранении заказа: проверьте, что объект
$orderкорректно получен черезwc_get_order()и что вызов$order->save()происходит без ошибок.
Практические советы по безопасности и производительности
- Не используйте слишком общий код, который блокирует любые изменения статусов — это может сломать логику бизнес-процессов.
- Для крупных магазинов с большим потоком заказов лучше минимизировать количество обработчиков хуков, чтобы не замедлять сайт.
- Если используете сторонние плагины для платежей, следите за обновлениями, возможно, они добавят официальные настройки для управления статусами.
- Резервное копирование базы данных перед внесением изменений в код обязательно, чтобы быстро откатиться при ошибках.
Таблица сравнения способов отключения автоматического обновления статусов
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Отключение в настройках шлюза | Простота, официальная поддержка | Не всегда доступно | Если доступна настройка в плагине |
Фильтр woocommerce_auto_complete_order | Точный контроль по методам оплаты | Требует программирования | Когда нужна гибкость и отключение для отдельных платежей |
Хук woocommerce_order_status_changed | Можно отменять любые изменения статусов | Может конфликтовать с другими плагинами | Когда нужно максимально жестко контролировать статусы |