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

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

Почему важно автоматизировать обновление статусов заказов в WooCommerce

Автоматизация обновления статусов заказов экономит время менеджеров и снижает вероятность ошибок. Вместо ручного контроля и изменения статусов можно настроить скрипт, который будет выполнять нужные действия в фоновом режиме.

Например, если заказ оплачен, но не был отправлен в течение 3 дней, можно автоматически изменить статус на "Отменён" и уведомить клиента. Или после доставки автоматически менять статус на "Выполнен" через 7 дней.

Для реализации таких сценариев удобно использовать WP Cron — встроенную систему планировщика задач WordPress, а также API WooCommerce для работы с заказами.

Настройка WP Cron для регулярного запуска скрипта

WP Cron позволяет запускать функции через заданные интервалы. Для нашего скрипта создадим собственное событие с интервалом, например, 1 час.

Добавим в functions.php или в плагин следующий код:

function wporders_add_cron_interval( $schedules ) {
    if( !isset( $schedules['hourly'] ) ) {
        $schedules['hourly'] = array(
            'interval' => 3600,
            'display'  => __('Каждый час')
        );
    }
    return $schedules;
}
add_filter('cron_schedules', 'wporders_add_cron_interval');

function wporders_schedule_order_status_update() {
    if (!wp_next_scheduled('wporders_update_order_status_event')) {
        wp_schedule_event(time(), 'hourly', 'wporders_update_order_status_event');
    }
}
add_action('wp', 'wporders_schedule_order_status_update');

Здесь мы добавили интервал "hourly" и запланировали событие wporders_update_order_status_event, которое будет вызываться каждый час.

Создание функции для обновления статусов заказов

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

Пример кода:

function wporders_update_order_status() {
    // Получаем заказы со статусом "processing" старше 3 дней
    $args = array(
        'limit'        => -1,
        'status'       => 'processing',
        'date_modified' => '<=' . ( time() - 3 * DAY_IN_SECONDS ),
    );
    $orders = wc_get_orders($args);

    foreach ( $orders as $order ) {
        // Меняем статус на "cancelled"
        $order->update_status('cancelled', 'Автоматическая отмена заказа по истечении 3 дней.');
    }

    // Получаем заказы со статусом "completed" старше 7 дней
    $args_completed = array(
        'limit'        => -1,
        'status'       => 'completed',
        'date_modified' => '<=' . ( time() - 7 * DAY_IN_SECONDS ),
    );
    $completed_orders = wc_get_orders($args_completed);

    foreach ( $completed_orders as $order ) {
        // Добавим пользовательскую логику, например, отправляем благодарственное письмо
        // wporders_send_thank_you_email($order);
    }
}
add_action('wporders_update_order_status_event', 'wporders_update_order_status');

Обратите внимание, что параметр date_modified в wc_get_orders не является стандартным фильтром, поэтому для фильтрации по дате лучше использовать аргумент 'date_created' или реализовать свою логику.

Правильный способ получить заказы старше N дней:

function wporders_update_order_status() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-3 days'));

    $args = array(
        'limit'  => -1,
        'status' => 'processing',
        'date_created' => '<=' . $date_threshold,
    );
    $orders = wc_get_orders($args);

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

Такой подход надёжно фильтрует заказы по дате создания.

Оптимизация и безопасность скрипта

При работе с массовым обновлением заказов важно контролировать нагрузку на сервер. Если заказов слишком много, лучше обрабатывать их порциями. Для этого можно использовать аргумент limit и запускать крон чаще.

Также стоит добавить логирование действий, чтобы отслеживать изменения и быстро реагировать на ошибки.

Пример логирования:

function wporders_log($message) {
    if (defined('WP_DEBUG') && WP_DEBUG) {
        error_log('[wporders] ' . $message);
    }
}

// Использование внутри функции
wporders_log('Обновлен статус заказа #' . $order->get_id());

Пример интеграции с плагином Clearfy Pro для оптимизации cron

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

Это особенно полезно для сайтов с большим количеством заказов и активными задачами.

Заключение по созданию скрипта обновления статусов заказов

Автоматизация обновления статусов заказов в WooCommerce — важный элемент эффективной работы интернет-магазина. Используя WP Cron, API WooCommerce и оптимальные фильтры, вы сможете создавать надёжные и производительные скрипты без привлечения сторонних плагинов.

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

Автоматическая отмена и возврат заказов в WooCommerce при проблемах с оплатой
22.04.2026
Автоматическая синхронизация заказов между WordPress и внешними системами
30.03.2026
Интеграция WordPress с системой управления заказами 1С
27.12.2025
WooCommerce: автоматическое изменение статусов заказов при проблемах с платежами
10.05.2026
Создание и использование shortcode в WordPress: подробное руководство с примерами кода
11.11.2025