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

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

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

Проверить, что смена статуса не происходит автоматически, можно следующим образом:

  • Перейдите в WooCommerce > Заказы и выберите заказ;
  • Обратите внимание на текущий статус заказа и поля с датами оплаты и доставки;
  • Если после выполнения условий (например, оплаты) статус не меняется, значит автоматизация отсутствует или настроена неправильно.

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

1. Использование хука woocommerce_order_status_changed для отслеживания изменений

Хук позволяет реагировать на смену статуса и запускать дополнительную логику.

add_action('woocommerce_order_status_changed', 'custom_change_order_status_based_on_conditions', 10, 4);function custom_change_order_status_based_on_conditions($order_id, $old_status, $new_status, $order) {    // Проверяем, если заказ только что оплачен    if ($new_status === 'processing') {        // Получаем сумму заказа        $total = $order->get_total();        // Получаем список товаров        $items = $order->get_items();        $has_special_product = false;        foreach ($items as $item) {            $product_id = $item->get_product_id();            // Проверяем наличие товара с ID 1234            if ($product_id == 1234) {                $has_special_product = true;                break;            }        }        // Если сумма больше 10000 и есть специальный товар, меняем статус на 'on-hold'        if ($total > 10000 && $has_special_product) {            $order->update_status('on-hold', 'Автоматический перевод заказа на удержание по условию');        }    }}

2. Автоматическое изменение статуса заказов, которые долго не обрабатываются

Для автоматического перевода заказов в статус отменённых через 7 дней после оплаты можно использовать WP-Cron:

function custom_cancel_old_processing_orders() {    $args = array(        'limit' => -1,        'status' => 'processing',        'date_paid' => '<' . ( time() - 7 * DAY_IN_SECONDS ),    );    $orders = wc_get_orders($args);    foreach ($orders as $order) {        $order->update_status('cancelled', 'Автоматическая отмена заказа, не обработанного за 7 дней');    }}add_action('wp', function() {    if (!wp_next_scheduled('custom_cancel_old_processing_orders_event')) {        wp_schedule_event(time(), 'daily', 'custom_cancel_old_processing_orders_event');    }});add_action('custom_cancel_old_processing_orders_event', 'custom_cancel_old_processing_orders');

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

  • Создайте тестовый заказ с товаром ID 1234 и суммой более 10000 рублей, оплатите его и убедитесь, что статус автоматически изменится на on-hold.
  • Создайте заказ в статусе processing и вручную установите дату оплаты более 7 дней назад (через базу данных или плагины), затем дождитесь запуска WP-Cron или форсируйте запуск, чтобы убедиться в автоматической отмене.
  • Проверяйте логи WooCommerce для сообщений с причиной смены статуса. Они должны содержать строки из комментариев в коде.

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

  • Хук не срабатывает: Убедитесь, что код добавлен в functions.php вашей темы или в плагин и что нет синтаксических ошибок.
  • WP-Cron не запускается: На некоторых хостингах WP-Cron отключен. Проверьте работу через wp_cron.php вручную или настройте системный CRON для вызова.
  • Статус не меняется из-за ограничений ролей или прав: Проверьте, что пользователь, от имени которого выполняется код, имеет права на изменение заказов.
  • Ошибка в ID товара или условии: Проверьте корректность ID товара и логику условий, чтобы не было конфликтов.

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

  • Не запускайте тяжелые операции внутри хука без необходимости — выгружайте данные выборочно.
  • Используйте WP-Cron для периодических задач, но контролируйте их выполнение, чтобы избежать накопления невыполненных событий.
  • Добавляйте комментарии к заказам при смене статуса, чтобы отслеживать автоматические изменения.
  • Проверяйте права доступа, чтобы исключить несанкционированные изменения статусов.

Сравнение подходов: плагин vs кастомный код

Метод Плюсы Минусы
Готовые плагины для автоматизации статусов Быстрая настройка, интерфейс без кода, поддержка обновлений Могут быть тяжеловесными, ограничены стандартным функционалом
Кастомный код (пример из статьи) Гибкость, точное выполнение условий, лёгкость поддержки Требуется знание PHP и WooCommerce, необходимость тестирования
Очистка и оптимизация таблиц в базе данных WordPress: эффективные методы и примеры кода
08.02.2026
Как избежать проблем с отключением AJAX в WooCommerce
21.02.2026
Исправление дублирующихся SKU в WooCommerce: поиск и устранение ошибок
28.04.2026
Как экспортировать и импортировать настройки WooCommerce с помощью кода
03.05.2026
Как добавить пользовательское поле в REST API WordPress
21.01.2026