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

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

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

Диагностика: как понять, что автоматизация нужна и что не работает

Если вы заметили, что заказы долго остаются в статусе «Ожидает оплаты» или «В обработке», хотя по логике бизнес-процесса они должны автоматически сменить статус, значит автоматизация отсутствует или сломана.

  • Проверьте, сколько заказов в WooCommerce находятся в одном статусе более 24 часов.
  • Осмотрите логи сервера и WooCommerce на предмет ошибок при попытке смены статуса.
  • Убедитесь, что WP-Cron работает корректно (будет подробно описано ниже).

Пошаговое решение: автоматическая смена статуса заказов через WP-Cron

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

Добавьте следующий код в файл functions.php вашей темы или в свой кастомный плагин:

function wplog_change_order_status_by_time() {
    $args = array(
        'limit'        => -1,
        'status'       => 'pending', // Статус, который нужно изменить
        'date_created' => '<' . ( new WC_DateTime( '-24 hours' ) )->format( 'Y-m-d H:i:s' ),
    );

    $orders = wc_get_orders( $args );

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

2. Регистрируем крон-задачу

Добавляем событие для запуска функции раз в час:

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

add_action( 'wplog_hourly_order_status_update', 'wplog_change_order_status_by_time' );

3. Проверяем выполнение WP-Cron

WP-Cron зависит от посещений сайта. Для сайтов с низкой посещаемостью лучше настроить системный cron:

# Пример команды для системного cron (Linux)
curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Настройте эту команду в crontab на сервере, чтобы запускать её, например, каждые 15 минут.

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

  • Создайте тестовый заказ со статусом «Ожидает оплаты» и установите дату создания более 24 часов назад (можно сделать через админку или базу данных).
  • Запустите вручную wplog_change_order_status_by_time() через консоль WP-CLI: wp eval 'wplog_change_order_status_by_time();'
  • Проверьте, что статус заказа изменился на «Отменён» и в комментариях заказа появилась запись с сообщением об автоматической смене.
  • Следите за логами ошибок и убедитесь, что ошибок нет.

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

  • WP-Cron не срабатывает: проверьте, что сайт получает трафик, иначе WP-Cron не запустится. Для надёжности настройте системный cron.
  • Заказы не меняют статус: проверьте правильность статусов в коде (например, pending и cancelled должны быть валидными статусами WooCommerce). Убедитесь, что функция вызывается и нет ошибок PHP.
  • Проблемы с датой создания: при фильтрации заказов по дате убедитесь, что формат даты совпадает с тем, что ожидает WooCommerce, и что дата действительно старше указанного времени.

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

  • Обрабатывайте заказы пакетами, если у вас очень большое количество заказов, чтобы избежать таймаута или переполнения памяти:
function wplog_change_order_status_by_time() {
    $paged = 1;
    do {
        $args = array(
            'limit'        => 20,
            'page'         => $paged,
            'status'       => 'pending',
            'date_created' => '<' . ( new WC_DateTime( '-24 hours' ) )->format( 'Y-m-d H:i:s' ),
        );

        $orders = wc_get_orders( $args );

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

        $paged++;
    } while ( count( $orders ) > 0 );
}
  • Проверяйте нагрузку сервера и время выполнения скрипта, при необходимости добавьте логирование для отладки.
  • При использовании системного cron убедитесь, что он запускается от пользователя с правами на чтение сайта и не конфликтует с другими задачами.

Сравнение вариантов реализации

СпособПлюсыМинусыКомпромисс
WP-CronПросто настроить, не требует доступа к серверуЗависит от посещаемости, возможны задержкиПодключить системный cron для надёжности
Системный cronСтабильный запуск по расписаниюТребуется доступ к серверу и навыки настройкиИспользовать вместе с WP-Cron
Плагины для автоматизацииИнтерфейс и дополнительные функции без кодаИзбыточность, нагрузка, зависимость от сторонних решенийИспользовать для сложных сценариев, иначе писать код
Как избежать конфликтов между плагинами в WordPress: практические советы и решения
13.12.2025
Как создать плагин для WordPress с нуля: практическое руководство
06.11.2025
Как автоматически изменять статус заказов WooCommerce по времени
07.05.2026
Как сделать автоматический sitemap в WordPress с помощью кода
08.02.2026
Как сделать уникальный список постов с заказанным порядком в WordPress
01.02.2026