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

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

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

Проверка текущей логики статусов поможет понять, где именно необходима автоматизация. Для этого зайдите в WooCommerce > Заказы и изучите логику переходов статусов в вашей бизнес-модели.

Какие хуки WooCommerce подходят для изменения статуса заказа

Основные хуки для управления статусами заказов:

  • woocommerce_order_status_pending — срабатывает при смене статуса на "в ожидании";
  • woocommerce_order_status_completed — при смене на "выполнен";
  • woocommerce_order_status_cancelled — при отмене заказа;
  • woocommerce_order_status_changed — общий хук для всех изменений статусов;
  • woocommerce_order_status_{old_status}_to_{new_status} — хук для конкретного перехода.

Для автоматического изменения статуса по таймауту полезно использовать wp_cron или внешние cron-задачи, вызывающие пользовательскую функцию с логикой изменения.

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

1. Добавляем cron-задачу для проверки заказов

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

2. Пишем функцию для отмены неоплаченных заказов старше 1 часа

add_action('wc_auto_cancel_unpaid_orders', function() {
    $args = [
        'limit'        => -1,
        'status'       => ['pending', 'on-hold'],
        'date_created' => '<' . (time() - HOUR_IN_SECONDS),
    ];
    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order->update_status('cancelled', 'Order automatically cancelled due to payment timeout.');
    }
});

3. Проверяем работу с помощью журнала заказов

Перейдите в WooCommerce > Заказы, отфильтруйте по статусу "отменён" и убедитесь, что заказы с датой создания более часа назад и статусом "в ожидании" или "на удержании" изменились.

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

  • Создайте тестовый заказ с любым способом оплаты, который переводит заказ в статус pending или on-hold.
  • Измените дату создания заказа в базе данных (если нужно, для ускорения теста) или подождите час.
  • Обновите страницу заказов и проверьте, что статус автоматически сменился на cancelled.
  • Посмотрите, что в комментариях заказа появилась запись о причине отмены.

Частые ошибки при автоматическом изменении статусов заказов

  • Отсутствие cron-задачи: если WordPress cron не запускается (например, из-за низкой посещаемости), задача не выполнится. Решение: настроить системный cron для вызова wp-cron.php.
  • Неправильные параметры запроса заказов: Например, неверное указание даты или статусов в wc_get_orders приведет к пустому результату. Пользуйтесь отладкой и var_dump.
  • Конфликты с другими плагинами: Некоторые плагины могут переопределять логику смены статусов. Проверяйте совместимость.

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

  • Не запускайте тяжелые запросы без лимитов: используйте пагинацию или ограничение количества обрабатываемых заказов за один запуск.
  • Добавьте проверку nonce и прав доступа, если функция вызывается через AJAX или REST API.
  • Логируйте изменения статусов в отдельный файл или используйте стандартный журнал WooCommerce для последующего аудита.
  • Для больших магазинов предпочтительно использовать системный cron вместо wp_cron для стабильности.

Сравнение подходов для автоматической смены статусов

МетодПреимуществаНедостатки
WP CronПростая реализация внутри WordPress, не требует внешних настроекЗависит от посещаемости сайта, может запускаться с задержкой
Системный CronТочная и стабильная работа по расписаниюТребует доступа к серверу и настройки
Вебхуки от платежных системМоментальная реакция на события оплатыНужна интеграция с внешними системами и обработка ошибок
WooCommerce: установка и настройка Webhook для автоматизации обработки заказов
30.04.2026
Как создать автоматический бэкап WordPress без плагинов
28.12.2025
Как кастомизировать страницу входа в WordPress без плагинов
19.01.2026
Как добавить автоматический подпись в email, отправляемый из WordPress
12.04.2026
Как сделать автоматический импорт контента в WordPress
04.01.2026

Ресурс в разработке, скоро здесь будет сайт по вордпресс