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

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

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

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

Чаще всего нужны автоматические изменения статусов по следующим сценариям:

  • Неоплаченные заказы переходят в отменённые после истечения срока оплаты (например, 7 дней).
  • Заказы со статусом «обработка» или «в ожидании» меняются на «завершённые» после отправки товара и истечения срока доставки.
  • Заказы с возвратами или отменами автоматически переводятся в соответствующие статусы через заданное время.

Чтобы автоматизировать эти процессы, нужно использовать WP-Cron и функции WooCommerce для изменения статуса заказа.

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

1. Добавляем функцию для смены статуса заказа

function wpbe_update_order_status_by_time() {
    $days_to_cancel = 7; // количество дней до отмены неоплаченного заказа
    $args = array(
        'status' => 'pending', // статус неоплаченных заказов
        'limit' => -1,
        'date_created' => '<' . ( time() - $days_to_cancel * DAY_IN_SECONDS ),
    );

    $orders = wc_get_orders($args);

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

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

add_action('wp_loaded', function() {
    if (!wp_next_scheduled('wpbe_daily_order_status_update')) {
        wp_schedule_event(time(), 'daily', 'wpbe_daily_order_status_update');
    }
});

add_action('wpbe_daily_order_status_update', 'wpbe_update_order_status_by_time');

3. Добавляем аналогичный код для других статусов, если нужно

Например, перевести заказы со статусом «в обработке» в «завершённые» через 14 дней после даты создания:

function wpbe_complete_orders_after_days() {
    $days_to_complete = 14;
    $args = array(
        'status' => 'processing',
        'limit' => -1,
        'date_created' => '<' . ( time() - $days_to_complete * DAY_IN_SECONDS ),
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order->update_status('completed', 'Автоматическое завершение заказа через 14 дней');
    }
}

add_action('wpbe_daily_order_status_update', 'wpbe_complete_orders_after_days');

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

  • В админке WooCommerce зайдите в раздел «Заказы» и отфильтруйте заказы по статусу «ожидает оплаты». Убедитесь, что заказы старше 7 дней автоматически стали «отменёнными».
  • Проверьте логи сервера или добавьте запись в лог прямо в функцию через error_log(), чтобы убедиться, что задача WP-Cron запускается.
  • Для тестирования можно временно уменьшить количество дней до 1 и посмотреть, как меняются статусы после запуска Cron.

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

  • WP-Cron не запускается автоматически: на некоторых хостингах WP-Cron зависит от посещений сайта. Для стабильной работы рекомендуется настроить системный Cron, который вызывает wp-cron.php раз в 5-15 минут.
  • Неправильный фильтр даты в wc_get_orders: параметр date_created должен быть в правильном формате. В нашем коде мы используем timestamp с оператором < для выборки старых заказов.
  • Функция не меняет статус заказа: убедитесь, что у пользователя, под которым работает скрипт, есть права на изменение заказов. Также проверьте, что статусы заданы правильно, без опечаток.
  • Конфликты с другими плагинами: если есть плагины, которые тоже управляют статусами, проверьте их логику и порядок приоритетов.

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

  • Для ускорения выборки заказов добавьте индексы в базу данных по колонке даты создания, если их нет.
  • При большом количестве заказов разбивайте обработку на части, например, обрабатывайте не все заказы сразу, а по 100 штук за запуск.
  • Используйте wp_schedule_single_event() для более точного запуска задач, если нужно обновлять статусы не реже, чем раз в сутки.
  • Логи действий записывайте в отдельный файл, а не в общий error_log, чтобы не захламлять системные логи.

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

МетодПлюсыМинусыКомпромисс
WP-Cron + собственный кодГибкость, полное управлениеЗависимость от Cron, требует знаний PHPНастроить системный Cron, чтобы повысить надёжность
Плагины автоматизации (например, WooCommerce Order Status Manager)Простота использования, готовый интерфейсМогут быть тяжёлыми, не всегда гибкиеИспользовать вместе с кастомным кодом для сложных сценариев
Ручное управлениеПростота, нет конкуренции с плагинамиТрудозатратно, ошибки пользователейТолько для небольших магазинов
Как удалить или изменить slug записи WordPress без потери SEO
05.01.2026
Как сделать автоматический откат обновлений WordPress при ошибках
08.03.2026
Как автоматически создавать и управлять копиями постов в WordPress
07.02.2026
Удаление проблемных постов в WordPress по заданным условиям
17.12.2025
Как автоматизировать управление перенаправлениями в WordPress
11.02.2026