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

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

В интернет-магазинах на WooCommerce часто возникает необходимость автоматически менять статус заказа спустя определённое время. Например, переводить заказы из статуса «В обработке» в «Завершено» после доставки, или отменять неоплаченные заказы через 24 часа. Автоматизация этих процессов снижает нагрузку на менеджеров и улучшает точность обработки заказов.

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

1. Определяем условия и статус для изменения

Решите, на каких статусах и через какой промежуток времени должна происходить смена. Например:

  • Статус processing меняется на completed через 3 дня после оплаты.
  • Статус pending меняется на cancelled через 24 часа без оплаты.

2. Создаём функцию смены статуса и запускаем её по Cron

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

function wpbloger_auto_update_order_status() {
    $args = array(
        'limit' => -1,
        'status' => array('processing', 'pending'),
        'date_modified' => '<' . ( time() - DAY_IN_SECONDS ), // 1 день назад
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $status = $order->get_status();
        $modified = $order->get_date_modified();
        $modified_timestamp = $modified ? $modified->getTimestamp() : 0;
        $now = time();

        if ( 'processing' === $status ) {
            // Меняем на completed если прошло больше 3 дней
            if ( $now - $modified_timestamp >= 3 * DAY_IN_SECONDS ) {
                $order->update_status( 'completed', 'Автоматическое завершение заказа через 3 дня.' );
            }
        } elseif ( 'pending' === $status ) {
            // Отменяем, если прошло больше 1 дня
            if ( $now - $modified_timestamp >= DAY_IN_SECONDS ) {
                $order->update_status( 'cancelled', 'Автоматическая отмена неоплаченного заказа через 1 день.' );
            }
        }
    }
}

// Регистрируем Cron задачу, если ещё не зарегистрирована
if ( ! wp_next_scheduled( 'wpbloger_auto_update_order_status_hook' ) ) {
    wp_schedule_event( time(), 'hourly', 'wpbloger_auto_update_order_status_hook' );
}

add_action( 'wpbloger_auto_update_order_status_hook', 'wpbloger_auto_update_order_status' );

3. Проверка работы крона и исправление проблем

Для проверки Cron задач используйте плагин WP Crontrol. В разделе "Cron Events" найдите wpbloger_auto_update_order_status_hook и вручную запустите её для теста. Проверьте логи заказов, отображается ли добавленная заметка о смене статуса.

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

  • Создайте тестовые заказы с нужными статусами и датами изменения.
  • Запустите Cron задачу вручную через WP Crontrol.
  • Обновите страницу заказа и убедитесь, что статус изменился, а в примечаниях появился комментарий.

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

  • Крон не срабатывает: Проверьте, что на сайте активна WordPress Cron. Если нет, настройте системный cron на сервере.
  • Неверные даты: Убедитесь, что дата изменения заказа корректно берётся через get_date_modified(), а не дата создания.
  • Неправильные статусы: Используйте статусы WooCommerce, доступные через wc_get_order_statuses(), и проверяйте текущий статус через get_status().
  • Изменения не сохраняются: Используйте метод update_status() для корректного обновления статуса заказа.

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

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

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

МетодПлюсыМинусы
Использование WP Cron (как в статье)Простота реализации, не требует сторонних плагиновЗависит от посещаемости сайта, возможны задержки
Настройка системного cron с wp-cliНадёжность и точность запуска задачТребует доступа к серверу и командной строке
Плагины автоматизации заказовИнтерфейс, дополнительные функцииДополнительная нагрузка, возможные конфликты
Как создать динамические виджеты в WordPress с помощью REST API
03.04.2026
Добавление поля телефона с подтверждением в форму регистрации WordPress
12.02.2026
Как правильно проверять права доступа в WordPress
04.01.2026
Как создать и использовать REST API эндпоинты в WordPress
26.12.2025
Как создать собственный виджет WordPress: пошаговое руководство
20.11.2025