Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed срабатывает при изменении статуса заказа в WooCommerce. Его часто применяют для автоматизации бизнес-процессов: отправка уведомлений, интеграция с CRM, изменение метаданных заказа, логирование и т.д.
Сигнатура хука:
do_action( 'woocommerce_order_status_changed', $order_id, $old_status, $new_status, $order );Параметры:
$order_id— ID заказа;$old_status— предыдущий статус заказа (например, 'pending');$new_status— новый статус заказа (например, 'completed');$order— объект WC_Order.
Диагностика проблемы: почему хук может не срабатывать или не работать корректно
Если ваш код на woocommerce_order_status_changed не выполняется, проверьте:
- Правильное подключение функции к хуку (корректный приоритет и количество аргументов);
- Использование актуальных версий WooCommerce и WordPress;
- Отсутствие конфликтов с другими плагинами или темой;
- Корректное изменение статуса заказа — хук не срабатывает при обновлении без смены статуса;
- Правильное получение объекта
WC_Orderи его методов.
Пошаговое решение: пример автоматической отправки письма при смене статуса на "completed"
1. Подключите функцию к хуку в файле functions.php вашей темы или в собственном плагине:
add_action('woocommerce_order_status_changed', 'custom_notify_order_completed', 10, 4);2. Реализуйте функцию:
function custom_notify_order_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
$to = $order->get_billing_email();
$subject = 'Ваш заказ №' . $order_id . ' выполнен';
$message = 'Здравствуйте! Ваш заказ успешно выполнен. Спасибо за покупку.';
wp_mail($to, $subject, $message);
}
}3. Сохраните изменения и протестируйте.
Проверка результата после внедрения
Чтобы убедиться, что функция работает:
- Создайте тестовый заказ в WooCommerce;
- Измените его статус вручную на "completed" в админке;
- Проверьте, пришло ли письмо на указанный email;
- Включите логирование почты (например, с помощью плагина Clearfy или
WP Mail Logging) для отладки.
Частые ошибки и как их исправить
- Ошибка: функция не вызывается
Причина: неправильно указано число аргументов вadd_action. Решение: укажите 4 аргумента, иначе объект$orderне передастся.add_action('woocommerce_order_status_changed', 'custom_function', 10, 4); - Ошибка: $order возвращает null
Причина: WooCommerce изменил API или версия плагина устарела.
Решение: убедитесь, что используете актуальную версию WooCommerce; можно получить объект черезwc_get_order($order_id)внутри функции. - Ошибка: email не отправляется
Причина: проблемы с почтовым сервером или неверный email.
Решение: проверьте настройки SMTP, используйте плагины для логирования почты и убедитесь, что email валиден.
Практические советы по безопасности и производительности
- Минимизируйте обработку внутри хука, особенно если выполняете внешние запросы — используйте очереди или CRON для тяжелых задач.
- Проверяйте права пользователя и статус заказа, чтобы избежать нежелательных запусков кода.
- Используйте
wp_mailс правильными заголовками и фильтрами для безопасности SMTP. - Для интеграций с CRM или сторонними сервисами добавляйте обработку ошибок и логирование для диагностики.
Сравнение способов реализации автоматизации на смену статуса заказа
| Способ | Преимущества | Недостатки |
|---|---|---|
Использование хука woocommerce_order_status_changed | Простота, встроенный API, гибкость | Выполнение в реальном времени может замедлить страницу |
| CRON-задачи для отложенной обработки | Не блокирует страницу, надежность при большом объеме задач | Сложнее реализовать, задержка в выполнении |
| Плагины автоматизации (например, AutomateWoo) | Готовые решения, удобный интерфейс | Дополнительные расходы, ограниченная кастомизация |