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

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

В стандартном WooCommerce статусы заказов меняются вручную или автоматически по некоторым событиям (например, оплата). Однако в ряде бизнес-сценариев требуется автоматическая смена статуса заказов по истечению определённого времени — например, перевод заказов из статуса «В обработке» в «Отменён» через 3 дня при отсутствии оплаты, или изменение «Выполняется» на «Завершён» спустя 7 дней после отправки.

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

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

1. Создаём функцию для обновления статусов заказов по срокам

Используем WP-Cron для запуска проверки заказов и смены статуса по времени.

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

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

    // Аналогично обновим заказы 'completed' старше 7 дней в статус 'archived' (если нужно)
    // Реализуйте под ваши задачи
}

2. Регистрируем событие WP-Cron для вызова функции раз в сутки

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

add_action( 'wc_daily_order_status_update', 'wc_auto_update_order_statuses' );

3. Запускаем задачу вручную при отладке

Для проверки можно вызвать функцию напрямую:

wc_auto_update_order_statuses();

Как проверить, что автоматическое обновление работает

  • Создайте тестовый заказ со статусом processing, у которого дата создания более 3 дней назад (можно вручную изменить в базе или через админку с помощью плагина типа WP phpMyAdmin).
  • Запустите функцию вручную через админ-панель, например, через плагин Code Snippets или временно в functions.php.
  • Проверьте, что статус заказа изменился на cancelled и в истории заказа появилась заметка об автоматическом обновлении.
  • Если используете WP-Cron, дождитесь срабатывания задачи или запустите wp-cron вручную (например, через WP-CLI wp cron event run wc_daily_order_status_update).

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

  • Заказы не обновляются: проверьте, активен ли WP-Cron, нет ли конфликтов с плагинами, которые могут отключать cron. Для проверки можно воспользоваться плагинами типа WP Crontrol.
  • Неверный фильтр даты: аргумент date_created в wc_get_orders должен быть в правильном формате. В примере используется timestamp в сравнении с текущим временем, однако WooCommerce ожидает строку в формате ISO 8601. Для исправления замените фильтр на array('before' => date('Y-m-d H:i:s', strtotime('-3 days'))):
$args = array(
    'limit'  => -1,
    'status' => 'processing',
    'date_created' => array(
        'before' => date( 'Y-m-d H:i:s', strtotime( '-3 days' ) ),
    ),
    'return' => 'ids',
);
  • Изменение статуса не сохраняется: убедитесь, что используете метод update_status(), а не просто меняете свойство объекта.
  • Слишком частое срабатывание WP-Cron: функция должна выполняться не чаще раза в сутки, чтобы не нагружать сервер. Используйте wp_schedule_event с интервалом daily.

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

  • Не запускайте обработку всех заказов без лимита на больших магазинах. Используйте пагинацию или ограничьте количество заказов за один запуск (например, 'limit' => 100).
  • Добавляйте логирование изменений в отдельный лог-файл или в системный лог для отладки и мониторинга.
  • Проверяйте права пользователя, если функцию вызываете из админки вручную.
  • Размещайте код в кастомном плагине или child-теме, чтобы не потерять изменения при обновлении.

Сравнение вариантов реализации автоматического обновления статусов заказов

ВариантПреимуществаНедостатки
Код на WP-CronГибкость, полное управление, нет зависимостейНужно писать и тестировать, возможны ошибки при больших данных
Плагины автоматизацииПростота настройки, готовые функцииМогут быть тяжелыми, не всегда подходят под специфичные задачи
Внешние CRON-задания (через сервер)Более надёжное выполнение, не зависит от посещаемостиТребуют доступа к серверу, навыков настройки
Как автоматизировать удаление отзывов в WordPress по условиям
12.03.2026
Как удалить или изменить slug записи WordPress без потери SEO
05.01.2026
Как использовать AJAX для динамической загрузки контента в WordPress
01.02.2026
WooCommerce: автоматическое удаление заказов по просроченным срокам
04.06.2026
Автоматическое удаление заказов WooCommerce по статусу с помощью кода
07.05.2026