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

Проблема: необходимость автоматической смены статусов заказов

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

Диагностика задачи

Перед автоматизацией важно чётко определить:

  • Какие статусы нужно менять автоматически (например, «обработка» → «завершён»).
  • Через сколько дней после создания заказа менять статус.
  • Исключения: например, не менять статус, если заказ в статусе «ожидает оплаты».

Для диагностики можно использовать SQL-запросы к базе, чтобы посчитать, сколько заказов подходит под критерии и не были изменены вручную.

Пошаговое решение: добавляем WP-Cron задачу

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

function auto_change_order_status() {
    $days = 7; // число дней для ожидания
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'limit' => -1,
        'status' => 'processing',
        'date_created' => '<' . $date_threshold,
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        // Проверяем дополнительные условия, если нужны
        $order->update_status('completed', 'Автоматическое завершение заказа');
    }
}

2. Регистрируем WP-Cron задачу

add_action('auto_change_order_status_hook', 'auto_change_order_status');

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

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

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

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

Чтобы проверить работу автоматизации:

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

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

  • WP-Cron не срабатывает — проблема с посещаемостью сайта. Решение: настроить системный cron на вызов wp-cron.php или использовать плагин для управления cron.
  • Недостаточно прав для изменения статуса — убедитесь, что функция вызывается с нужными правами, и WooCommerce активен.
  • Функция обновления статусов не вызывается — проверьте правильность регистрации хука и расписания cron.
  • Ошибка в аргументах wc_get_orders — используйте валидные параметры, например, 'date_created' => '<YYYY-MM-DD' или фильтры WP_Query.

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

  • Устанавливайте разумный интервал запуска WP-Cron (не чаще раза в день), чтобы не перегружать сервер.
  • Проверяйте наличие заказов перед массовым обновлением, чтобы избежать лишних операций.
  • Логируйте изменения статусов для аудита и отката в случае ошибок.
  • Если на сайте много заказов, используйте пагинацию или batch-обработку в функции.

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

СпособПлюсыМинусыПример
WP-Cron и кастомный кодГибкость, нет новых плагинов, полный контрольЗависит от посещаемости сайта, требует навыковКод из статьи выше
Плагин автоматизации заказов (например, WooCommerce Order Status Manager)Простота настройки, поддержкаПлатный, меньше контроля над логикойПлагин в репозитории WooCommerce
Внешние сервисы (Webhook + API)Интеграция с CRM и аналитикойСложность настройки, задержкиWebhook в WooCommerce + внешние скрипты
Как удалить все посты из категории в WordPress: практическое руководство
17.11.2025
Внутренняя переадресация в WordPress: как сделать без плагинов
03.12.2025
Как добавить автоматическое отправление сообщений в контактной форме WordPress
07.04.2026
Как автоматически изменять meta description в WordPress для улучшения SEO
17.04.2026
Ограничение количества категорий для постов в WordPress: практическое руководство
24.01.2026