Автоматическое изменение статуса заказов в WooCommerce по заданным условиям

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

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

Типичные ситуации:

  • Заказы, оплаченные через сторонние платежные системы, не обновляют статус автоматически.
  • Необходима смена статуса по дате — например, перевод заказа в "выполнен" через 7 дней после отправки.
  • Автоматическое аннулирование заказов с определённым статусом и без оплаты.

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

1. Использование хука woocommerce_order_status_changed для доп. логики

Этот хук срабатывает при изменении статуса заказа. Можно добавить код, который при достижении определённого статуса меняет его на другой по условию.

add_action('woocommerce_order_status_changed', 'auto_change_order_status', 10, 4);
function auto_change_order_status($order_id, $old_status, $new_status, $order) {
    // Если заказ стал 'processing' и сумма больше 10000 — переводим в 'on-hold'
    if ($new_status === 'processing' && $order->get_total() > 10000) {
        $order->update_status('on-hold', 'Автоматический перевод из-за суммы заказа');
    }
}

2. Автоматическое завершение заказа через WP-Cron

Чтобы автоматически менять статус заказа спустя определённое время, используем планировщик WP-Cron.

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

add_action('auto_complete_orders_hook', 'auto_complete_orders_function');

function auto_complete_orders_function() {
    $args = array(
        'status' => 'processing',
        'date_modified' => '<' . (date('Y-m-d H:i:s', strtotime('-7 days'))),
        'limit' => -1
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        $order->update_status('completed', 'Автоматическое завершение заказа через 7 дней');
    }
}

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

Для проверки работы автоматизации:

  1. Создайте тестовый заказ с суммой выше 10000, измените статус на processing и проверьте, что он автоматически перейдёт в on-hold.
  2. Измените дату модификации старого заказа на более чем 7 дней назад, запустите WP-Cron вручную (например, через плагин WP Crontrol) и убедитесь, что статус изменится на completed.

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

  • Код не срабатывает: проверьте, активен ли плагин, в котором добавлен код, и нет ли синтаксических ошибок.
  • WP-Cron не запускается: на некоторых серверах WP-Cron отключён по умолчанию. Используйте внешние сервисы для запуска или настройте системный cron.
  • Неправильный формат даты в запросе: ключ date_modified требует форматирования, либо используйте фильтр date_modified_before через SQL-запрос.
  • Конфликты с другими плагинами: деактивируйте сторонние плагины, влияющие на статусы заказов, чтобы проверить совместимость.

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

  • Добавляйте проверку прав пользователя, если код запускается из пользовательских запросов.
  • Оптимизируйте запросы к базе данных, избегайте выборок с большим числом заказов без лимитов.
  • Кэшируйте результаты, если необходимо часто проверять статусы.
  • Используйте WP-Cron с осторожностью: для критичных задач лучше системный cron, так как WP-Cron зависит от посещений сайта.

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

МетодПреимуществаНедостатки
Хук woocommerce_order_status_changedМгновенная реакция на изменение статуса, простота реализацииРаботает только при ручном или программном изменении статуса
WP-Cron для отложенных измененийПозволяет менять статус по времени, автоматизацияЗависимость от работы cron, возможны задержки
Использование сторонних плагиновГотовое решение с интерфейсом, поддержкаДополнительные ресурсы, возможные ограничения в настройках
Как добавить дополнительные поля в форму регистрации WordPress
24.01.2026
Как использовать методы для удаления вариативных товаров WooCommerce при удалении атрибута
09.06.2026
Как запретить регистрацию по определённым email-доменам в WordPress
14.04.2026
Как создать собственный метабокс в WordPress
06.11.2025
Как удалить неиспользуемые метаданные в базе данных WordPress
06.12.2025

Задать вопрос о вордпресс, получить ответ - это все можно сделать в нашем сообществе WP. Сайт в данный момент в разработке, изучите ссылки ниже: