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

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

В WooCommerce часто требуется автоматизировать изменение статусов заказов, чтобы не контролировать вручную, например, отменять неоплаченные заказы после определенного времени или переводить заказы в статус "завершен" спустя несколько дней после доставки. Ручное управление неэффективно и подвержено ошибкам.

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

1. Используем WP-Cron для запуска задачи по расписанию

WordPress имеет встроенный механизм планировщика задач — wp_cron. Мы будем создавать собственную задачу, которая будет запускаться по расписанию и менять статус заказов.

2. Функция для смены статуса заказов

Пример функции для автоматической отмены заказов, находящихся в статусе "ожидает оплаты" дольше 24 часов:

function wc_auto_cancel_unpaid_orders() {
    $args = array(
        'limit' => -1,
        'status' => 'pending', // статус "ожидает оплаты"
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ), // старше 24 часов
    );
    $orders = wc_get_orders( $args );

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

3. Регистрация события в wp_cron

Добавим событие, которое будет запускаться каждый час:

function wc_schedule_auto_cancel() {
    if ( ! wp_next_scheduled( 'wc_auto_cancel_event' ) ) {
        wp_schedule_event( time(), 'hourly', 'wc_auto_cancel_event' );
    }
}
add_action( 'wp', 'wc_schedule_auto_cancel' );
add_action( 'wc_auto_cancel_event', 'wc_auto_cancel_unpaid_orders' );

4. Очистка после деактивации

Чтобы удалить запланированное событие при отключении кода:

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

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

  • Создайте тестовый заказ в статусе "ожидает оплаты" с датой создания старше 24 часов (например, редактированием в базе данных или изменением системного времени).
  • Дождитесь, пока запустится wp_cron (или вызовите вручную через WP-CLI wp cron event run wc_auto_cancel_event).
  • Проверьте, изменился ли статус заказа на "отменён".
  • Логируйте действия для отладки, например, добавив error_log('Отменён заказ ID: ' . $order->get_id()); внутри цикла.

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

  • WP-Cron не срабатывает регулярно: Причина — отсутствие посещений сайта или неправильные настройки сервера. Решение — настроить системный cron на вызов wp-cron.php или использовать внешние сервисы.
  • Функция не находит заказы: Проверьте правильность параметров запроса wc_get_orders, дату создания и статус.
  • Статус не меняется: Убедитесь, что у пользователя, от имени которого запускается скрипт, есть права. В контексте cron это обычно админ. Проверьте ошибки PHP и WooCommerce логи.

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

  • Не используйте слишком частый запуск cron-задач (например, каждый минуту), чтобы не нагружать базу.
  • Добавляйте логирование и уведомления администратору о выполнении задач для контроля.
  • В продакшене используйте системный cron для вызова wp-cron.php вместо стандартного механизма WordPress.
  • Проверяйте права доступа и не запускайте массовые операции от имени пользователей с ограниченными правами.

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

МетодПлюсыМинусыПример
WP-Cron + кастомный кодГибкость, полное управление логикойЗависит от посещаемости сайта, требует тестированияКод из статьи
Плагины автоматизации WooCommerceГотовые решения, удобный интерфейсМогут быть платными, нагрузка на сайтWooCommerce Automations
Внешние cron-сервисы + REST APIНадежность расписанийТребуется настройка внешнего сервисаЗапросы к API для изменения статуса
Как создать инструмент для массовой замены текстов в постах WordPress
11.02.2026
Автоподстановка значений в шаблоны WordPress: практические методы и примеры
12.03.2026
Как создать автоматический раздел постов в WordPress по дате и категории
08.03.2026
Как создать автоматическое отправление email в WordPress по расписанию
06.01.2026
Как сделать отзывы с оценками в WordPress без плагинов
18.03.2026