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

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

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

Если вы замечаете, что статусы заказов не обновляются вовремя, или хотите разгрузить сотрудников от ручных операций, стоит реализовать автоматическое обновление статусов с помощью хуков и WP-Cron.

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

Шаг 1. Определяем условия обновления

Например, переведём заказы со статусом processing в completed через 7 дней после оплаты.

Шаг 2. Создаём функцию для смены статуса

function wpstuff_update_order_status_auto() {
    $args = [
        'limit' => -1,
        'status' => 'processing',
        'date_paid' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
    ];
    $orders = wc_get_orders( $args );
    foreach ( $orders as $order ) {
        if ( $order->has_status( 'processing' ) ) {
            $order->update_status( 'completed', 'Автоматическое обновление статуса после 7 дней' );
        }
    }
}

Обратите внимание, что параметр date_paid в wc_get_orders не поддерживается напрямую. Вместо него нужно фильтровать вручную:

function wpstuff_update_order_status_auto() {
    $orders = wc_get_orders( [ 'limit' => -1, 'status' => 'processing' ] );
    $time_limit = time() - 7 * DAY_IN_SECONDS;
    foreach ( $orders as $order ) {
        $paid_date = $order->get_date_paid();
        if ( $paid_date && $paid_date->getTimestamp() < $time_limit ) {
            $order->update_status( 'completed', 'Автоматическое обновление статуса после 7 дней' );
        }
    }
}

Шаг 3. Добавляем задачу в WP-Cron

Чтобы функция выполнялась регулярно, регистрируем кастомное событие и привязываем к нему нашу функцию.

add_action( 'wpstuff_daily_order_status_update', 'wpstuff_update_order_status_auto' );

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

Шаг 4. Очистка при деактивации

function wpstuff_clear_scheduled_order_status_update() {
    $timestamp = wp_next_scheduled( 'wpstuff_daily_order_status_update' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpstuff_daily_order_status_update' );
    }
}
register_deactivation_hook( __FILE__, 'wpstuff_clear_scheduled_order_status_update' );

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

Чтобы проверить работу автоматизации:

  • Создайте тестовый заказ в статусе processing, у которого дата оплаты была более 7 дней назад (можно вручную изменить в базе или через админку, если позволяет).
  • Запустите вручную функцию wpstuff_update_order_status_auto() через консоль WP-CLI или добавьте вызов на время теста.
  • Проверьте, что статус заказа изменился на completed и в комментариях к заказу появилась запись об обновлении.
  • Убедитесь, что задача WP-Cron запускается (можно использовать плагин WP Crontrol для мониторинга).

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

  • WP-Cron не срабатывает: если сайт не получает посетителей, cron-задачи могут не запускаться. Используйте системный cron или внешние сервисы для вызова wp-cron.php.
  • Неверное условие даты оплаты: wc_get_orders не фильтрует по дате оплаты напрямую, фильтруйте вручную по $order->get_date_paid().
  • Отсутствие прав на обновление: убедитесь, что код выполняется с достаточными правами (обычно в админке или через wp-cli).
  • Потенциальная нагрузка: если много заказов, запросы могут быть ресурсоёмкими. Используйте пагинацию и лимиты в выборке.

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

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

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

СпособПлюсыМинусы
WP-Cron + кастомный кодГибкость, полное управление, бесплатноЗависит от посещаемости сайта, требует программирования
Плагины автоматизации (например, AutomateWoo)Интерфейс, готовые триггеры и действияПлатно, может быть избыточно, нагрузка
Внешние cron-задачи + API вызовыНадёжность, не зависит от трафикаСложность настройки, требует сервера с cron
WooCommerce: как автоматически удалять заказы по установленному сроку
05.07.2026
Как создать собственный shortcode в WordPress с примерами кода
05.11.2025
Как создать автоматический импорт контента в WordPress с помощью WP REST API и плагинов
05.02.2026
Как отключить автоматическое обновление плагинов WooCommerce без потери безопасности
19.05.2026
Как избежать проблем с разносистемными скриптами в WooCommerce
27.05.2026