Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed — это один из основных инструментов для разработчиков, которые хотят реагировать на изменение статуса заказа в WooCommerce. Он позволяет запускать кастомные функции при переходе заказа из одного статуса в другой, что удобно для автоматизации бизнес-процессов: уведомлений, смены метаданных, интеграции с внешними сервисами и т.д.
Сигнатура хука
Этот хук принимает следующие параметры:
$order_id(int) — ID заказа;$old_status(string) — предыдущий статус;$new_status(string) — текущий статус;$order(WC_Order) — объект заказа.
Диагностика: как проверить, что хук срабатывает
Часто разработчики сталкиваются с тем, что их функции на хук не запускаются. Для диагностики используйте простой логгер:
add_action('woocommerce_order_status_changed', function($order_id, $old_status, $new_status, $order) {
error_log("Order #$order_id changed from $old_status to $new_status");
}, 10, 4);Если в wp-content/debug.log появляется нужная запись при смене статуса заказа, значит хук работает корректно.
Пошаговое решение: пример автоматической отправки письма при смене статуса на 'completed'
Задача: отправлять кастомное письмо клиенту, когда заказ сменяет статус на completed.
1. Подключитесь к хуку woocommerce_order_status_changed с приоритетом 10 и 4 параметрами.
2. Проверьте, что новый статус — completed.
3. Получите объект заказа и email клиента.
4. Отправьте письмо через wp_mail().
add_action('woocommerce_order_status_changed', 'send_custom_completed_email', 10, 4);
function send_custom_completed_email($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'completed') {
return;
}
$to = $order->get_billing_email();
$subject = 'Ваш заказ #' . $order_id . ' выполнен';
$message = 'Спасибо за покупку! Ваш заказ теперь завершен.';
wp_mail($to, $subject, $message);
}Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce с любым статусом, кроме
completed. - В панели администратора измените статус заказа на
completed. - Проверьте почту, указанную в заказе, — должно прийти письмо с указанным текстом.
- Для отладки используйте
error_logвнутри функции, чтобы проверить выполнение.
Частые ошибки и как их исправить
- Функция не вызывается: убедитесь, что при добавлении хука указан параметр
4в конце, так как нужно 4 аргумента. - Письмо не отправляется: проверьте настройки почтового сервера и используйте плагины SMTP для диагностики.
- Неверный статус: помните, что статусы передаются в нижнем регистре, проверяйте строгое равенство.
- Объект $order не передается: если используете старую версию WooCommerce, возможно, придется получить объект вручную через
wc_get_order($order_id).
Практические советы по безопасности и производительности
- Не выполняйте тяжелые операции в функциях на хуках — используйте очереди или WP-Cron для асинхронной обработки.
- Проверяйте, что
$order— валидный объект перед использованием методов. - Для отправки писем используйте функции WooCommerce Mailer, если нужна интеграция с шаблонами.
- Добавляйте nonce и права доступа, если функция изменяет данные в пользовательском интерфейсе.
Сравнение способов автоматизации при смене статуса заказа
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_order_status_changed с кастомным кодом | Гибкость, полный контроль, без плагинов | Требует навыков разработки, возможна ошибка в коде | Уникальная логика, интеграции, кастомные задачи |
| Плагины автоматизации (например, AutomateWoo) | Удобный интерфейс, много функций без кода | Платные, могут влиять на производительность | Стандартные сценарии без глубокого кастома |
| WP-Cron для отложенных задач после смены статуса | Асинхронность, разгрузка сервера | Зависит от посещаемости сайта, сложнее настроить | Тяжелые операции, массовая обработка |