WooCommerce: как отключить автоматическое изменение статуса заказа

|

Диагностика проблемы автоматического изменения статуса заказа в WooCommerce

В стандартной установке WooCommerce статусы заказов меняются автоматически в зависимости от действий пользователя и платежных шлюзов. Например, после оплаты заказа он может переходить в статус "Обработка" или "Завершён". В некоторых сценариях, например, при кастомных методах оплаты или интеграциях, такое автоматическое изменение статуса не нужно или мешает бизнес-логике.

Чтобы диагностировать, откуда именно происходит изменение статуса, нужно просмотреть логи и понять, какие хуки вызывают смену. Часто автоматические переходы реализованы в платежных шлюзах или в стандартных обработчиках WooCommerce.

Как проверить источник изменения статуса?

Пошаговое решение: как отключить автоматическую смену статуса заказа

Для контроля статуса заказа лучше всего перехватить событие, когда WooCommerce пытается изменить статус, и при необходимости отменить его.

1. Перехват и отмена смены статуса с помощью хука woocommerce_order_status_changed

Этот хук вызывается после изменения статуса. Чтобы предотвратить изменение, нужно вмешаться раньше — через фильтр woocommerce_pre_transition_order_status (начиная с WooCommerce 7.0).

2. Использование фильтра woocommerce_pre_transition_order_status

add_filter('woocommerce_pre_transition_order_status', 'disable_auto_status_change', 10, 3);function disable_auto_status_change($new_status, $old_status, $order) {    // Список статусов, которые хотим заблокировать    $blocked_statuses = array('processing', 'completed');    // Если пытаются сменить статус на один из заблокированных — отменяем смену    if (in_array($new_status, $blocked_statuses)) {        return $old_status; // возвращаем старый статус, отменяя изменение    }    return $new_status;}

В этом примере мы блокируем автоматический переход заказов в статусы "Обработка" и "Завершён".

Проверка результата после внедрения

Частые ошибки и их исправление

Альтернативное решение для старых версий WooCommerce

Если фильтр woocommerce_pre_transition_order_status недоступен, можно использовать хук woocommerce_order_status_changed для отката статуса:

add_action('woocommerce_order_status_changed', 'revert_status_change', 10, 4);function revert_status_change($order_id, $old_status, $new_status, $order) {    $blocked_statuses = array('processing', 'completed');    if (in_array($new_status, $blocked_statuses)) {        // Откатываем статус обратно        $order->set_status($old_status, 'Откат автоматической смены статуса');        $order->save();    }}

Этот метод менее предпочтителен, так как статус уже меняется, и откат происходит после факта.

Практические советы по безопасности и производительности

Сравнение вариантов реализации

Метод Плюсы Минусы Подходит для
Фильтр woocommerce_pre_transition_order_status Превентивное блокирование, не происходит смены статуса Требует WooCommerce 7.0 и выше Современные сайты с обновлённым WooCommerce
Хук woocommerce_order_status_changed и откат Работает на старых версиях WooCommerce Статус меняется и затем откатывается — возможны проблемы с последовательностью событий Старые сайты, где нельзя обновлять WooCommerce
Как создать многоуровневый фильтр продуктов в WordPress без плагинов
11.01.2026
Как установить ограничение по числу публикаций на странице архива WordPress
15.03.2026
Как избежать конфликтов между плагинами в WordPress: практические решения
03.03.2026
Как создать комплексный фильтр для записей WordPress с несколькими условиями
27.02.2026
WooCommerce: как установить ограничения на сроки доставки и способы оплаты для конкретных товаров
10.05.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше