Как использовать хук woocommerce_order_status_changed для автоматизации задач в WooCommerce

Что такое хук woocommerce_order_status_changed и для чего он нужен

Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Он принимает несколько параметров: ID заказа, старый статус, новый статус и объект заказа. Этот хук часто используется для автоматизации различных операций, например, отправки уведомлений, обновления метаданных, интеграции с CRM или ERP, а также для запуска бизнес-логики на смену статуса.

Подпись хука

do_action( 'woocommerce_order_status_changed', $order_id, $old_status, $new_status, $order );

Диагностика: как понять, что ваш код на хук не работает

Если вы добавили обработчик на этот хук, но он не срабатывает, проверьте следующее:

  • Правильность названия хука — должно быть именно woocommerce_order_status_changed.
  • Подключение функции через add_action с нужными параметрами (4 параметра).
  • Проверка, что код выполняется в контексте WooCommerce (например, в functions.php или плагине, где доступен WC).
  • Отсутствие конфликтов с другими плагинами, которые могут блокировать выполнение.
  • Логи ошибок PHP и debug.log для выявления фатальных ошибок.

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

Для примера автоматизируем отправку кастомного уведомления при смене статуса заказа с processing на completed.

  1. Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:
add_action('woocommerce_order_status_changed', 'wpmod_custom_order_status_action', 10, 4);
function wpmod_custom_order_status_action($order_id, $old_status, $new_status, $order) {
    if ($old_status === 'processing' && $new_status === 'completed') {
        // Получаем email покупателя
        $email = $order->get_billing_email();
        $subject = 'Ваш заказ выполнен';
        $message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' выполнен и готов к отправке.';
        wp_mail($email, $subject, $message);
    }
}
  1. Сохраните изменения и обновите страницу админки WooCommerce.
  2. Измените статус любого заказа вручную из processing в completed через админ-панель WooCommerce.

Как проверить, что код сработал

  • Проверьте почтовый ящик покупателя, указанный в заказе — должно прийти письмо с темой "Ваш заказ выполнен".
  • Включите логирование почты для отладки, если письма не приходят: добавьте define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); в wp-config.php и проверьте wp-content/debug.log.

Расширение: логирование изменений статусов для аудита

Для ведения аудита можно записывать изменения статуса в отдельный лог-файл:

add_action('woocommerce_order_status_changed', 'wpmod_log_order_status_change', 10, 4);
function wpmod_log_order_status_change($order_id, $old_status, $new_status, $order) {
    $log_entry = sprintf(
        "%s: Заказ #%d изменил статус с '%s' на '%s'\n",
        date('Y-m-d H:i:s'),
        $order_id,
        $old_status,
        $new_status
    );
    error_log($log_entry, 3, WP_CONTENT_DIR . '/order-status.log');
}

Частые ошибки при использовании woocommerce_order_status_changed

  • Неправильное число аргументов в add_action: хук требует 4 аргумента, если функция принимает меньше, она не получит все данные.
  • Использование устаревших статусов: WooCommerce использует префикс wc- в некоторых хук-событиях, но в этом хуке статусы передаются без префикса, например, completed, а не wc-completed.
  • Отсутствие проверки статусов: выполнение действий без фильтрации статусов может привести к избыточной нагрузке.
  • Проблемы с правами доступа: код должен выполняться в правильном контексте, чтобы получить объект заказа и данные.

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

  • Минимизируйте тяжелые операции внутри обработчика — если нужно отправлять данные в сторонние сервисы, делайте это асинхронно через wp-cron или очереди.
  • Проверяйте валидность данных заказа перед выполнением действий.
  • Для больших магазинов с высокой нагрузкой используйте логи и мониторинг для отслеживания ошибок в обработчиках.

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

ПодходПлюсыМинусыПример
Обработка через hook woocommerce_order_status_changed Прямая интеграция, легкость настройки, доступ к объекту заказа Нагрузка при большом количестве заказов, требует проверки статусов Код из статьи выше
Использование плагинов автоматизации (например, AutomateWoo) Удобный UI, много готовых сценариев, поддержка интеграций Платно, менее гибко для кастомных задач Плагин AutomateWoo
Использование WP-Cron для отложенных задач после смены статуса Снимает нагрузку, позволяет планировать задачи Зависит от cron, возможны задержки Отложенная отправка уведомлений
Отключение автоматического возврата средств в WooCommerce и настройка возврата с подтверждением
30.06.2026
Как использовать фильтры и хуки WooCommerce для изменения цены товара в корзине
03.05.2026
Как сделать статус заказа WooCommerce назначенным по умолчанию при создании
14.05.2026
WooCommerce: как исправить невозможность удаления заказа после оплаты
27.06.2026
Как отключить автоматические письма WooCommerce при отмене товара в заказе
07.05.2026