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

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

В интернет-магазинах на WooCommerce часто возникает задача автоматизировать перевод заказов в разные статусы по истечении определённого времени. Например, автоматически переводить заказы из статуса "В ожидании оплаты" в "Отменён" через 3 дня, если покупатель не завершил оплату. Это помогает поддерживать актуальность данных, освобождать склад для повторных заказов и улучшать учёт.

Без автоматизации такие задачи требуют ручного контроля, что увеличивает вероятность ошибок и задержек.

Типичные случаи для автоматизации изменения статусов

  • Отмена неоплаченных заказов через заданный срок
  • Перевод заказов из статуса "Обработка" в "Выполнен" после доставки
  • Перевод заказов в статус "Архив" спустя несколько месяцев

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

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

Шаг 1. Написание функции для изменения статусов

function wpbe_auto_update_order_status() {
    $days_to_wait = 3; // Количество дней до смены статуса
    $old_date = date('Y-m-d H:i:s', strtotime("-{$days_to_wait} days"));

    $args = array(
        'limit'        => -1,
        'status'       => 'pending', // статус, который проверяем
        'date_created' => '<' . $old_date,
        'return'       => 'ids',
    );

    $orders = wc_get_orders($args);

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

Шаг 2. Регистрация WP-Cron для запуска функции ежедневно

add_action('wpbe_daily_order_status_change', 'wpbe_auto_update_order_status');

if (!wp_next_scheduled('wpbe_daily_order_status_change')) {
    wp_schedule_event(time(), 'daily', 'wpbe_daily_order_status_change');
}

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

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

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

1. Создайте тестовый заказ в статусе pending.

2. Измените дату создания заказа на дату более 3 дней назад (через базу данных или плагин для редактирования даты).

3. Запустите вручную крон-задачу (для тестирования можно вызвать функцию напрямую или через WP-CLI):

wp eval 'wpbe_auto_update_order_status();'

4. Проверьте, что статус заказа изменился на cancelled и в истории заказа появился комментарий с причиной.

5. После подтверждения корректности автоматизация будет работать ежедневно без вашего участия.

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

  • Нет запуска WP-Cron: если на сайте мало трафика, WP-Cron может не запускаться. Используйте системный cron на сервере для запуска wp-cron.php.
  • Неправильный статус или дата заказа: убедитесь, что фильтр 'date_created' =< $old_date корректно сравнивает даты, и заказы действительно подходят под условие.
  • Функция не вызывается: проверьте, что хук wpbe_daily_order_status_change добавлен и расписание установлено через wp_schedule_event.
  • Конфликты с другими плагинами: отключите временно все плагины кроме WooCommerce и проверьте работу кода.

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

  • Не загружайте слишком много заказов за один проход. Если заказов много, используйте постраничный запрос ('limit' => 100 и обработка в несколько циклов).
  • Добавьте логирование изменений статусов в отдельный файл или системный журнал для аудита.
  • Для больших магазинов рассмотрите использование сторонних систем очередей, чтобы избежать нагрузок во время WP-Cron.
  • Обязательно очищайте расписания при деактивации кода, чтобы избежать «висячих» кронов.

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

МетодПлюсыМинусыПример
WP-Cron + кастомный кодГибкость, полный контроль, не требует плагиновЗависит от трафика, требует навыков кодаКод из статьи
Плагины управления заказамиПростота настройки, готовый интерфейсМогут быть платными, менее гибкиеWooCommerce Order Status Manager
Внешние сервисы (Zapier и др.)Автоматизация вне сайта, интеграцииСложнее настроить, возможны задержкиИнтеграции через API
Как удалить автосохранения и ревизии в WordPress для оптимизации базы данных
21.03.2026
Как создать собственный шорткод WordPress с поддержкой параметров
06.11.2025
Как избежать конфликтов плагинов в WordPress: практические советы и примеры кода
07.04.2026
Автоматическое удаление спама в комментариях WordPress
03.12.2025
Как добавить автоподсказки в поиск WordPress
05.01.2026