Как автоматически изменять статус заказов на «Неактивные» в WooCommerce

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

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

Стандартного функционала для такой автоматизации в WooCommerce нет, поэтому задача решается кастомным кодом с использованием WP-Cron или хуков.

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

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

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

function wplog_set_orders_to_inactive() {
    $days_inactive = 30; // количество дней до смены статуса
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));

    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'on-hold'), // статусы для проверки
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    );

    $orders = wc_get_orders($args);

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

2. Подключение функции к WP-Cron для регулярного выполнения

Добавим событие, которое будет запускать функцию ежедневно.

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

add_action('wplog_daily_inactive_orders', 'wplog_set_orders_to_inactive');

3. Очистка расписания при деактивации темы или плагина

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

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

Для проверки корректности работы:

  • Создайте тестовый заказ со статусом pending или on-hold, установите дату создания более 30 дней назад через базу данных или плагины для редактирования заказов.
  • Запустите вручную крон-событие в WP-CLI: wp cron event run wplog_daily_inactive_orders
  • Проверьте, что статус заказа изменился на cancelled.

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

  • Функция не запускается — проверьте, что WP-Cron работает на сервере. Для теста используйте WP-CLI или сторонний плагин управления кроном.
  • Заказы не обновляются — убедитесь, что у заказов правильный статус и дата создания действительно старше указанного порога.
  • Конфликты с другими плагинами — отключите плагины, которые могут влиять на статусы заказов, и повторите тест.
  • Повторный запуск крон-события — используйте функции wp_next_scheduled() и wp_unschedule_event() для корректного управления задачами.

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

  • Добавляйте ограничения на количество обрабатываемых заказов в одном запуске, чтобы избежать перегрузки сервера:
$args['limit'] = 100; // обрабатываем партиями по 100 заказов
  • Логируйте изменения статусов для отладки и аудита, например, используя стандартный лог WordPress или отдельный файл.
  • Если сайт большой, рассмотрите использование внешних CRON-сервисов вместо стандартного WP-Cron, чтобы избежать нерегулярных запусков.
  • Для кастомных статусов («неактивные») создавайте их через register_post_status() и используйте вместо стандартных, если хотите сохранить логику заказов.

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

МетодПлюсыМинусыРекомендации
Код с WP-Cron (пример выше)Контроль, гибкость, бесплатноНужны навыки программирования, зависит от WP-CronДля опытных разработчиков и средних магазинов
Плагины автоматизации (например, AutomateWoo)Удобный интерфейс, много функцийПлатно, нагрузка на сайтДля магазинов с бюджетом и сложной логикой
Внешние CRON-сервисы + APIНадёжность, точностьСложно настроить, требует API и навыковДля крупных проектов с высокой нагрузкой
Ограничение количества категорий для постов в WordPress: практическое руководство
24.01.2026
Удаление изображений из библиотеки медиа WordPress по дате
22.02.2026
Как автоматически удалять старые черновики в WordPress
16.01.2026
Как создать собственный шорткод в WordPress с примерами кода
28.11.2025
Как автоматически изменять статус заказов WooCommerce по времени
07.05.2026