Использование хука WooCommerce 'woocommerce_order_status_changed' для кастомной логики

Что такое хук 'woocommerce_order_status_changed' и зачем он нужен

Хук woocommerce_order_status_changed — это action, который срабатывает каждый раз при изменении статуса заказа в WooCommerce. Он позволяет выполнять дополнительную логику после смены статуса, например, отправлять уведомления, обновлять метаданные, запускать интеграции с внешними сервисами.

Подписка на этот хук — стандартный способ расширения функционала магазина без модификации ядра WooCommerce.

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

  • Код с хуком не подключён или подключён в неправильном месте (нужно в functions.php темы или в плагине).
  • Используется неправильный приоритет или параметры функции.
  • Несовпадение имён статусов заказа (статусы пишутся в нижнем регистре, например, completed, processing).
  • Неверное количество аргументов в функции-обработчике.
  • Код выполняется слишком рано, до инициализации WooCommerce.

Пошаговое решение: как правильно использовать 'woocommerce_order_status_changed'

1. Подключение обработчика в functions.php

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

add_action('woocommerce_order_status_changed', 'my_custom_order_status_change', 10, 4);
function my_custom_order_status_change($order_id, $old_status, $new_status, $order) {
    // Проверяем, что $order - объект WC_Order
    if (!is_a($order, 'WC_Order')) {
        $order = wc_get_order($order_id);
    }

    // Пример: отправка письма при смене статуса на completed
    if ($new_status === 'completed' && $old_status !== 'completed') {
        // Ваша логика
        error_log('Заказ ' . $order_id . ' изменён на completed');
        // Например, отправка письма
        $to = $order->get_billing_email();
        $subject = 'Ваш заказ выполнен';
        $message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' выполнен.';
        wp_mail($to, $subject, $message);
    }
}

2. Проверка имени статусов

Убедитесь, что статусы указываются правильно. Например, стандартные статусы WooCommerce:

  • pending — ожидает оплаты
  • processing — в обработке
  • completed — выполнен
  • cancelled — отменён
  • refunded — возвращён

3. Использование объекта заказа

В обработчике можно использовать объект WC_Order для получения любой информации о заказе, например, товаров, клиента, суммы, метаданных.

$items = $order->get_items();
foreach ($items as $item_id => $item) {
    $product_name = $item->get_name();
    $quantity = $item->get_quantity();
    // ваша логика
}

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

1. Сделайте тестовый заказ в WooCommerce.

2. Измените статус заказа в админке (например, на 'completed').

3. Проверьте логи (файл wp-content/debug.log) или почту, если настроена отправка.

4. Убедитесь, что дополнительная логика сработала (например, письмо отправилось, запись в лог появилась).

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

  • Ошибка: Call to undefined function wc_get_order().
    Причина: вызов до инициализации WooCommerce.
    Решение: подключайте обработчик через plugins_loaded или позже, например, в init с приоритетом 20.
  • Ошибка: не приходит почта.
    Причина: неправильно настроен SMTP или wp_mail.
    Решение: используйте плагин SMTP и проверьте настройки серверной почты.
  • Ошибка: функция обработчика не вызывается.
    Причина: неправильное количество параметров в add_action.
    Решение: укажите 4 параметра, как в примере (add_action('woocommerce_order_status_changed', 'func', 10, 4)).
  • Ошибка: сравнение статусов с ошибками из-за регистра.
    Решение: используйте строгое сравнение с правильным регистром.

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

  • Не выполняйте тяжёлые операции (например, внешние API-запросы) напрямую в обработчике, используйте очереди или wp_cron.
  • Проверяйте, что объект заказа валиден, чтобы избежать ошибок PHP.
  • Логируйте ошибки и ключевые действия для последующей отладки.
  • Используйте nonce и проверяйте права пользователя для действий, если добавляете формы или AJAX-запросы, связанные с изменением статусов.

Сравнение способов реализации дополнительной логики

МетодПреимуществаНедостатки
Хук 'woocommerce_order_status_changed' в functions.phpПростота, быстрое внедрение, полный доступ к объекту заказаЗависимость от темы, сложность поддержки на больших проектах
Создание отдельного плагина с обработчикомЛегко переносить, изолированность кода, удобство обновленияНужно дополнительное тестирование, чуть дольше настройка
Использование сторонних плагинов с триггерамиНе требует программирования, можно быстро настроитьОграниченная гибкость, возможны конфликты, нагрузка на сайт
Как создать собственный плагин WordPress: пошаговое руководство
31.10.2025
Как избежать конфликтов между WPML и WooCommerce: практическое руководство
19.04.2026
Как изменить вывод пользовательских полей в WordPress: практические решения
07.02.2026
Как удалить неактивных пользователей WordPress с помощью кода
29.03.2026
Как использовать WPRemark для автоматического контроля качества контента в WordPress
23.01.2026