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

Диагностика задачи: зачем менять статус заказа автоматически

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

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

Есть несколько вариантов реализации автоматического изменения статусов:

  • Использовать хуки WooCommerce, например woocommerce_order_status_changed для запуска кода при смене статуса.
  • Использовать крон-задачи для периодической проверки заказов и смены статуса.
  • Подключать сторонние плагины с расширенной логикой, но это может влиять на производительность.

Когда использовать хуки, а когда крон

Если изменение статуса зависит от действия пользователя (например, после оплаты), логично использовать хуки. Если нужно менять статус по времени (например, через 3 дня после создания), лучше крон-задачи.

Пошаговое решение: пример автоматической смены статуса при достижении определённой суммы заказа

Допустим, хотим автоматически переводить заказ в статус "Выполнен", если сумма заказа больше 5000 рублей и заказ оплачен.

1. Добавляем кастомный код в functions.php вашей темы или в отдельный плагин

add_action('woocommerce_order_status_processing', 'auto_complete_high_value_orders');
function auto_complete_high_value_orders($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Проверяем сумму
    $total = $order->get_total();
    if ($total > 5000) {
        // Меняем статус на 'completed'
        $order->update_status('completed', 'Автоматическая смена статуса для заказов свыше 5000');
    }
}

Этот код срабатывает, когда заказ переводится в статус "Обработка" (processing). Если сумма больше 5000, статус автоматически меняется на "Выполнен".

2. Проверяем работу

  • Создайте тестовый заказ с суммой выше 5000 руб.
  • Оплатите заказ (например, тестовым платежом).
  • Посмотрите, что статус заказа сначала становится "Обработка", а затем автоматически меняется на "Выполнен".

Автоматическая смена статуса по времени с использованием WP-Cron

Если необходимо менять статус заказов через определённое время — например, переводить в "Отменён" если не оплачен через 3 дня, используем WP-Cron.

Пример кода для отмены неоплаченных заказов через 3 дня

add_action('wp', 'setup_order_status_cron');
function setup_order_status_cron() {
    if (!wp_next_scheduled('auto_cancel_unpaid_orders')) {
        wp_schedule_event(time(), 'daily', 'auto_cancel_unpaid_orders');
    }
}

add_action('auto_cancel_unpaid_orders', 'cancel_unpaid_orders');
function cancel_unpaid_orders() {
    $args = [
        'limit' => -1,
        'status' => 'pending', // неоплаченные
        'date_created' => '<' . (time() - 3*24*60*60), // старше 3 дней
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order->update_status('cancelled', 'Автоматическая отмена неоплаченного заказа через 3 дня');
    }
}

// Не забудьте очистить крон при деактивации плагина
register_deactivation_hook(__FILE__, 'clear_order_status_cron');
function clear_order_status_cron() {
    wp_clear_scheduled_hook('auto_cancel_unpaid_orders');
}

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

Чтобы убедиться, что автоматическая смена статусов работает:

  • Создайте тестовые заказы, подходящие под условия (по сумме, по дате, по статусу).
  • Отслеживайте изменение статусов в админке WooCommerce.
  • Для WP-Cron используйте плагин WP Crontrol для просмотра и запуска задач вручную.

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

  • Хук не срабатывает: Проверьте, что используемый хук актуален и правильно написан. Например, woocommerce_order_status_processing срабатывает при смене в статус "Обработка", а не при любом обновлении.
  • Статус не меняется: Убедитесь, что у заказа есть нужный статус и сумма корректно возвращается через $order->get_total().
  • WP-Cron не запускается: На некоторых хостингах WP-Cron может не работать автоматически. Запустите вручную через WP Crontrol или настройте системный cron для вызова wp-cron.php.
  • Код в functions.php вызывает ошибки: Проверьте синтаксис, отключите кеширование и отладку ошибок, чтобы выявить проблему.

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

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

Сравнение вариантов реализации автоматической смены статусов

МетодПлюсыМинусы
Хуки WooCommerceМгновенное срабатывание, простой кодТолько при событиях, не подходит для отложенных изменений
WP-CronПодходит для периодических проверок и массовых измененийЗависит от работы WP-Cron, возможны задержки
ПлагиныГотовые решения, поддержка интерфейсовМожет влиять на производительность, лишний функционал
Как автоматически изменять статус заказа WooCommerce по условиям
26.04.2026
Как создать динамический PDF-файл в WordPress с помощью PHP
05.01.2026
WooCommerce: автоматическое удаление отменённых заказов по расписанию с оптимизацией
28.06.2026
Как использовать REST API в WordPress для расширения функционала
11.11.2025
Как автоматизировать удаление старых комментариев в WordPress
11.03.2026