Диагностика проблемы: почему статус заказа меняется автоматически после оплаты
В WooCommerce после успешной оплаты заказ по умолчанию переводится в статус processing или completed (в зависимости от настроек и типа товара). Иногда это поведение нежелательно, например, если для заказа требуется дополнительная проверка или ручная обработка. Чтобы решить эту задачу, нужно понять, какие хуки и функции отвечают за смену статуса и как их можно переопределить.
Проверка текущего поведения
- Откройте заказ в админке WooCommerce и оплатите тестовым способом.
- Отследите смену статуса в разделе заказов.
- Если статус меняется автоматически, значит, срабатывает стандартный механизм WooCommerce.
Пошаговое решение: отключение автоматического изменения статуса заказа
Для контроля над сменой статуса после оплаты можно использовать фильтр 'woocommerce_payment_complete_order_status', который позволяет задать желаемый статус вместо стандартного.
add_filter('woocommerce_payment_complete_order_status', 'custom_payment_complete_order_status', 10, 2);function custom_payment_complete_order_status($status, $order_id) { // Возвращаем исходный статус, чтобы отменить автоматическую смену return 'on-hold'; // или любой другой статус, например 'pending'В данном примере после успешной оплаты заказ будет переходить в статус on-hold вместо processing или completed. Это позволит выполнить дополнительные действия с заказом вручную.
Другой вариант: полностью отменить смену статуса
Если нужно, чтобы статус оставался неизменным, можно вернуть текущий статус заказа:
add_filter('woocommerce_payment_complete_order_status', 'keep_current_status_after_payment', 10, 2);function keep_current_status_after_payment($status, $order_id) { $order = wc_get_order($order_id); return $order->get_status();}Проверка результата после внедрения
- Добавьте код в файл
functions.phpактивной темы или в кастомный плагин. - Создайте тестовый заказ и оплатите его тестовым платежом.
- Проверьте, что статус заказа после оплаты не меняется на автоматический, а устанавливается в нужный вам статус.
- Для отладки можно добавить
error_logили временный вывод статуса заказа.
Частые ошибки и как их исправить
- Код не срабатывает: проверьте, что код добавлен в правильное место и активна текущая тема или плагин.
- Статус не меняется: возможно, другой плагин или тема переопределяют логику смены статуса. Попробуйте отключить сторонние плагины и проверить снова.
- Использование неправильного статуса: WooCommerce поддерживает ограниченный набор статусов заказа. Используйте только допустимые:
pending,on-hold,processing,completed,cancelled,refunded,failed.
Практические советы по безопасности и производительности
- Добавляйте кастомный код через дочернюю тему или плагин, чтобы не потерять изменения при обновлении.
- Проверяйте совместимость с другими плагинами, особенно с плагинами оплаты и статусами заказов.
- Ограничьте количество запросов к базе при использовании функции
wc_get_order(), кэшируйте данные при необходимости.
Сравнение вариантов решения
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_payment_complete_order_status | Изменение статуса при оплате через фильтр | Гибкий, простой в реализации | Может быть переопределён другими плагинами |
| Полное отключение смены статуса | Возврат текущего статуса заказа | Защищает от автоматических изменений | Может привести к зависанию заказа без обновления |
| Использование плагинов контроля статусов | Графический интерфейс для настройки статусов | Удобно для администраторов без кода | Дополнительная нагрузка и возможные конфликты |