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

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

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

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

  • Много заказов в статусе "в обработке" или "ожидает оплаты", которые долго не меняют статус.
  • Ручное обновление статусов занимает много времени и приводит к ошибкам.
  • Нужна автоматизация для определенного бизнес-процесса — например, автоматическое закрытие заказов, которые не были оплачены в течение 3 дней.

Пошаговое решение: реализация автоматического изменения статуса заказов по времени

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

Ниже сниппет, который переводит заказы из статуса processing в completed, если они находятся в статусе более 3 дней:

function wpnews_auto_update_order_status() {
    $args = array(
        'status' => 'processing',
        'limit' => -1,
        'date_modified' => '<' . ( time() - 3 * DAY_IN_SECONDS ),
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        // Проверяем дату создания заказа
        $order_date = strtotime( $order->get_date_created() );
        if ( $order_date && $order_date <= ( time() - 3 * DAY_IN_SECONDS ) ) {
            $order->update_status( 'completed', 'Статус изменён автоматически через 3 дня в статусе processing.' );
        }
    }
}

2. Запускаем функцию по расписанию через WP-Cron

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

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

add_action( 'wpnews_daily_order_status_update', 'wpnews_auto_update_order_status' );

3. Остановка автоматизации (если нужно)

Чтобы удалить задачу, используйте:

function wpnews_unschedule_order_status_update() {
    $timestamp = wp_next_scheduled( 'wpnews_daily_order_status_update' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpnews_daily_order_status_update' );
    }
}
// wpnews_unschedule_order_status_update(); // вызвать однократно для удаления

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

  • Зайдите в WooCommerce > Заказы и найдите заказы со статусом completed, которые ранее были processing и созданы более 3 дней назад.
  • Посмотрите в комментарии к заказу: должно появиться сообщение "Статус изменён автоматически через 3 дня в статусе processing."
  • Для отладки можно добавить error_log внутри функции, например: error_log('Обновлён заказ №' . $order->get_id()); и смотреть логи сервера.

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

  • Крон-задача не запускается: Проверьте, что в WordPress корректно работает WP-Cron, посетите сайт и убедитесь, что в wp_options есть запись с расписанием. Если на хостинге отключён WP-Cron, настройте системный cron для вызова wp-cron.php.
  • Заказы не обновляются: Убедитесь, что статусы и даты проверяются корректно. Для отладки выведите в лог значения дат и статусов.
  • Функция обновления запускается слишком часто или редко: Проверьте период запуска в wp_schedule_event — 'daily' означает раз в 24 часа, можно использовать свои интервалы, регистрируя их через cron_schedules.
  • Проблемы с правами доступа: Сниппеты должны быть добавлены в файл functions.php дочерней темы или в свой плагин, а не в плагины, которые могут конфликтовать.

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

  • Используйте wc_get_orders с параметром limit и пагинацией, если заказов очень много, чтобы избежать превышения лимита памяти и таймаутов.
  • Добавляйте логику в функции, которая не изменяет статусы без необходимости — проверяйте дату и статус.
  • Для критичных операций лучше делать резервное копирование базы перед запуском автоматизации.
  • Соблюдайте принцип минимальных прав — не запускайте код от администратора, если это не нужно.
  • Если автоматизация нужна более гибкая — рассмотрите использование WPShop Clearfy Pro для оптимизации и очистки, а также интеграцию с WP-Cron через WP-CLI для надёжности.

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

МетодПреимуществаНедостаткиПример
Сниппет с WP-CronБесплатно, гибко, легко кастомизируетсяЗависит от корректной работы WP-Cron, при большом количестве заказов может тормозитьПример в статье
Плагин автоматизации заказовГотовое решение, поддержка, интерфейсПлатно или с избыточным функционалом, нагрузкаWooCommerce Order Status Manager и др.
Внешний cron + WP-CLIНадёжнее WP-Cron, подходит для больших сайтовНужен доступ к серверу, сложнее в настройкеwp cron event run wpnews_daily_order_status_update
Как создать собственный виджет WordPress: подробное руководство
25.11.2025
Как добавить автоматическое обновление плагинов в WordPress без помощи коммерческих пакетов
20.12.2025
Как использовать Hooks в WordPress для расширения функциональности
12.11.2025
Автоматический импорт новостей в WordPress с использованием WP REST API
29.03.2026
Как создать автоматические уведомления о новостях в WordPress
10.03.2026