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

Зачем нужно автоматическое изменение статуса заказа в WooCommerce

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

Диагностика задачи и подготовка к решению

Перед реализацией нужно четко определить бизнес-логику:

  • Какой статус меняется и на какой (например, из «processing» в «completed» или «cancelled»).
  • Через сколько времени после создания заказа должен меняться статус.
  • Нужно ли учитывать дополнительные условия (например, оплата, доставка).

Также проверьте, включен ли WP-Cron и работает ли он корректно, так как решение будет основано на периодическом запуске задач.

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

1. Добавляем пользовательское событие в WP-Cron

Сначала регистрируем собственное событие, которое будет запускать функцию проверки и изменения статусов заказов:

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

2. Определяем функцию изменения статуса заказов

Создадим функцию, которая будет искать заказы в статусе «processing» старше, например, 7 дней и переводить их в «completed»:

add_action( 'wc_change_order_status_cron_hook', 'wc_change_order_status_automatically' );

function wc_change_order_status_automatically() {
    $args = [
        'limit' => -1,
        'status' => 'processing',
        'date_created' => '<' . ( time() - WEEK_IN_SECONDS ),
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        // Проверяем, что заказ действительно старше 7 дней
        $created = $order->get_date_created()->getTimestamp();
        if ( $created < ( time() - WEEK_IN_SECONDS ) ) {
            $order->update_status( 'completed', 'Статус автоматически изменён после 7 дней обработки.' );
        }
    }
}

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

Чтобы не оставлять задач в WP-Cron после удаления кода, добавим удаление задачи:

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

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

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

  • Создайте тестовый заказ со статусом «processing» и датой создания более 7 дней назад (можно изменить дату через базу или плагин для тестирования).
  • Запустите WP-Cron вручную для теста, например, с помощью плагина WP Crontrol.
  • Проверьте, что статус заказа изменился на «completed» и появилась запись в истории изменений с вашим комментарием.

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

  • Событие WP-Cron не запускается: проверьте, что на сервере посетители посещают сайт или настройте системный cron для запуска wp-cron.php (пример: wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1).
  • Заказы не находятся: убедитесь, что используете правильный параметр 'date_created' в wc_get_orders и формат даты соответствует требованиям (timestamp Unix).
  • Статус не меняется: проверьте, что у функции update_status правильные параметры и у пользователя/процесса есть права на изменение заказов.

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

  • Проверяйте количество обрабатываемых заказов, чтобы избежать таймаутов скрипта. Можно обрабатывать партии по 50-100 заказов за раз.
  • Добавьте логирование действий в отдельный файл или в debug.log для контроля работы скрипта.
  • Используйте проверки nonce и прав, если функция будет вызываться через AJAX или REST API.
  • Для повышения производительности рассмотрите использование транзиентов для кеширования выборки заказов, если скрипт вызывается часто.

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

ВариантПреимуществаНедостаткиРекомендуемая сфера
WP-Cron + пользовательский кодПолный контроль, гибкость, отсутствие плагиновЗависит от WP-Cron, требует навыков программированияСредние и крупные проекты с кастомной логикой
Плагины автоматизации (например, AutomateWoo)Удобный интерфейс, готовые триггерыПлатные, нагрузка на сайт, ограниченная гибкостьМалые проекты, где нет разработчиков
Внешние скрипты с WP-CLIПолный контроль, не зависит от WP-CronТребует доступа к серверу, сложнее в настройкеСерверы с SSH доступом, опытные администраторы
Как избежать проблем с AJAX в WordPress при загрузке файлов
23.02.2026
Как автоматически удалять старые новости в WordPress
11.04.2026
Как создать собственный блок в Gutenberg WordPress: практическое руководство
15.01.2026
Как использовать WP-Cron для отложенных задач в WordPress без плагинов
07.05.2026
Как настроить индивидуальные ценовые правила в WooCommerce для разных ролей пользователей
13.05.2026