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

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

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

Если статусы не меняются автоматически, это ведет к ошибкам в учете, задержкам в обработке заказов и ухудшению клиентского опыта.

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

1. Хук для автоматической отмены заказа через 24 часа без оплаты

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

add_action('woocommerce_order_status_pending', 'auto_cancel_unpaid_orders');
function auto_cancel_unpaid_orders($order_id) {
    $order = wc_get_order($order_id);
    $date_created = $order->get_date_created();
    if (!$date_created) return;

    $now = new DateTime('now', new DateTimeZone('UTC'));
    $diff = $now->getTimestamp() - $date_created->getTimestamp();

    // Если прошло более 24 часов
    if ($diff >= 86400) {
        $order->update_status('cancelled', 'Order cancelled automatically after 24 hours without payment');
    }
}

Этот код сработает при каждом изменении статуса на "pending" (ожидание оплаты) и проверит, прошло ли 24 часа. Если да — отменит заказ.

2. Автоматическое перевод заказа в статус "завершен" после доставки

Если вы интегрируете службу доставки с WooCommerce, можно автоматически переводить заказ в статус "completed" по событию доставки. Например, на событие изменения мета-поля доставки:

add_action('woocommerce_update_order', 'auto_complete_order_on_delivery');
function auto_complete_order_on_delivery($order_id) {
    $order = wc_get_order($order_id);
    $delivery_status = get_post_meta($order_id, '_delivery_status', true);

    if ($delivery_status === 'delivered' && $order->get_status() !== 'completed') {
        $order->update_status('completed', 'Order automatically completed after delivery');
    }
}

Замените '_delivery_status' на реальное мета-поле вашей системы доставки.

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

  • Создайте тестовый заказ со статусом "pending" и дождитесь 24 часов или измените дату создания заказа в базе для теста.
  • Проверьте, что заказ автоматически изменился на "cancelled".
  • Для второй функции обновите мета-поле '_delivery_status' в заказе на 'delivered' и проверьте статус заказа.
  • Используйте инструменты отладки, например Query Monitor, для просмотра вызовов хуков и ошибок.

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

  • Хук не срабатывает: проверьте правильность имени хука, он должен быть именно таким, как в документации WooCommerce.
  • Дата и время не корректны: убедитесь, что используете правильный часовой пояс и формат даты; используйте объекты DateTime для вычислений.
  • Функция обновления статуса не меняет статус: проверьте права пользователя, под которым выполняется код, и статус заказа, чтобы не менять статус некорректно.
  • Производительность: если код срабатывает слишком часто, добавьте кеширование или проверку условий, чтобы уменьшить нагрузку.

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

  • Используйте проверку nonce и права доступа, если вызываете обновление статуса из AJAX или внешних запросов.
  • Избегайте тяжелых операций внутри хуков, особенно при массовом обновлении заказов; лучше использовать WP-Cron для периодических задач.
  • Для крупных магазинов с высокой нагрузкой рассмотрите использование отдельного сервиса или плагина для обработки статусов.
  • Отслеживайте логи ошибок и событий для быстрой диагностики проблем.

Сравнение подходов: плагин vs кастомный код

КритерийКастомный кодПлагинКомпромисс
ГибкостьВысокая — код можно подстроить под любые задачиОграничена функциями плагинаИспользовать плагин с возможностью добавления хуков
ПроизводительностьОптимизированный код быстрееПлагины могут добавлять лишнюю нагрузкуВыбирать легковесные плагины
БезопасностьЗависит от качества кодаПроверяется авторами плагинаКомбинировать с аудитом кода
ОбновленияСамостоятельно поддерживатьАвтоматические обновленияИспользовать кастом в виде плагина
Как использовать хук WooCommerce для обновления мета данных заказа на этапе оформления
07.05.2026
Как изменить URL авторских связей в WordPress без плагинов
11.12.2025
Как отключить автовыделение и автозагрузку изображений в WordPress
02.02.2026
Как использовать хуки WooCommerce для автоматического изменения статуса заказов
30.04.2026
Как использовать REST API для создания нестандартных эндпоинтов в WordPress
22.12.2025