Автообновление статуса заказа в WooCommerce по срокам

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

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

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

1. Создание кастомной WP-Cron задачи

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

if ( ! wp_next_scheduled( 'wpall_auto_update_order_status' ) ) {
    wp_schedule_event( time(), 'hourly', 'wpall_auto_update_order_status' );
}

2. Обработчик события: обновление статусов заказов

Добавим функцию, которая будет запускаться раз в час и менять статус заказов, соответствующих критериям.

add_action( 'wpall_auto_update_order_status', 'wpall_update_order_status_by_time' );

function wpall_update_order_status_by_time() {
    $days_to_complete = 7; // Количество дней после оплаты
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_to_complete} days" ) );

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

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        // Дополнительная проверка: заказ оплачен и не закрыт
        if ( $order->has_status( 'processing' ) && $order->get_date_paid() && $order->get_date_paid()->date( 'Y-m-d H:i:s' ) <= $date_threshold ) {
            $order->update_status( 'completed', 'Автообновление статуса после ' . $days_to_complete . ' дней.' );
        }
    }
}

Как проверить, что автообновление работает

  • Создайте тестовый заказ с оплатой и статусом processing.
  • Измените дату оплаты заказа в базе данных (таблица wp_posts.post_date или через инструмент разработки WooCommerce) на дату более чем 7 дней назад.
  • Запустите вручную WP-Cron командой или дождитесь автоматического запуска (раз в час):
wp cron event run wpall_auto_update_order_status
  • Проверьте, что статус заказа изменился на completed и в истории заказа появился комментарий с текстом "Автообновление статуса после 7 дней."

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

  • Отсутствие запуска WP-Cron: убедитесь, что на вашем сервере работает WP-Cron, или настройте системный cron с командой wp cron event run --due-now. Проверьте логи сервера и плагина WP Crontrol.
  • Неправильный статус заказа: код ориентирован на статус processing. Для других статусов измените параметр 'status' в wc_get_orders.
  • Неверное сравнение даты: параметр 'date_paid' => '<=2024-05-01' использует кастомный формат. Если фильтр не работает, используйте WP_Query с мета-запросом по _date_paid или фильтр в PHP.
  • Много заказов и нагрузка: при большом количестве заказов добавьте пагинацию и обрабатывайте партии по 50-100 заказов за раз.

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

  • Не отключайте WP-Cron — это основной механизм автоматизации в WordPress.
  • Добавьте проверку nonce или прав администратора, если решите делать запуск через админку.
  • Для повышения производительности избегайте выборки всех заказов одним запросом — используйте пагинацию с параметрами 'limit' и 'offset'.
  • Логируйте работу задачи в отдельный файл или в системный журнал, чтобы отслеживать ошибки и успешные обновления.
  • Если заказы очень старые, можно добавить ограничение по максимальному возрасту, чтобы не обрабатывать слишком старые записи.

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

Вариант Плюсы Минусы Когда использовать
WP-Cron с PHP-кодом (как в статье) Гибкость, полный контроль, бесплатно Зависит от корректной работы WP-Cron, нагрузка при большом количестве заказов Для магазинов с умеренной нагрузкой и кастомными условиями
Плагин автоматизации (например, AutomateWoo) Простота настройки, визуальный интерфейс, расширенные условия Платный, нагрузка на сайт Для крупных магазинов с бюджетом и сложными сценариями
Внешний cron и WP REST API Независимость от WP-Cron, высокая надёжность Требует настройки внешнего сервера и безопасности Для высоконагруженных сайтов и критичных задач
Авторизация по одноразовому паролю (OTP) в WordPress с практическими решениями
16.01.2026
Удаление неиспользуемых ролей и их метаданных в WordPress
21.04.2026
Как создавать динамические скрипты в WordPress с примерами кода
10.12.2025
Как создать автоматические резервные копии базы данных WordPress с помощью PHP
03.01.2026
Как сделать автоматическое удаление спама в комментариях WordPress
23.01.2026