Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed срабатывает при изменении статуса заказа в WooCommerce. Это позволяет запускать автоматические действия — отправлять уведомления, обновлять пользовательские поля, интегрироваться с внешними системами и др. Использование этого хука — один из самых надежных способов построить кастомную логику, завязанную на изменения в заказах.
Диагностика: когда и как правильно использовать 'woocommerce_order_status_changed'
Чтобы понять, нужен ли вам этот хук, ответьте на вопросы:
- Нужно ли реагировать именно на смену статуса заказа, а не на обновление его метаданных?
- Требуется ли запускать код при конкретных переходах, например, от
processingкcompleted? - Необходима ли интеграция с внешними сервисами (CRM, склад, email-рассылки) при изменении заказа?
Если да, то woocommerce_order_status_changed — ваш инструмент.
Пошаговое решение: как реализовать обработчик
1. Подключение функции к хуку
add_action('woocommerce_order_status_changed', 'my_custom_order_status_changed', 10, 4);2. Создание функции-обработчика
function my_custom_order_status_changed($order_id, $old_status, $new_status, $order) {
// Проверяем переход статуса
if ($old_status === 'processing' && $new_status === 'completed') {
// Получаем email покупателя
$email = $order->get_billing_email();
// Отправляем кастомное уведомление
wp_mail($email, 'Ваш заказ завершен', 'Спасибо за покупку! Ваш заказ #' . $order_id . ' успешно выполнен.');
// Логируем для отладки
error_log('Order #' . $order_id . ' status changed from processing to completed');
}
}3. Кэш и производительность
Если обработчик вызывает внешние API, используйте асинхронные запросы или wp_schedule_single_event для отложенного выполнения, чтобы не замедлять переход статуса.
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce и переведите статус вручную из
processingвcompleted. - Проверьте, пришло ли письмо на указанный email.
- Посмотрите логи PHP (файл error_log) на наличие сообщения из
error_log. - Если задействованы внешние API, убедитесь, что данные передаются корректно.
Частые ошибки и способы их исправления
- Неправильное количество аргументов: Хук требует 4 аргумента, обязательно указывайте их в
add_action(четвертый параметр). - Использование устаревших статусов: Проверьте, что статусы корректны (например,
pending,processing,completed). - Отсутствие проверки перехода: Обрабатывайте только нужные переходы, иначе код будет выполняться слишком часто.
- Долгое выполнение кода: Запросы к внешним сервисам лучше делать асинхронно, чтобы не блокировать процесс смены статуса.
Практические советы по безопасности и производительности
- Валидация входящих данных из объекта
$order— используйте строго типизированные методы WooCommerce. - Для тяжелых задач используйте
wp_schedule_single_event, чтобы выполнить их в фоне. - Логируйте ошибки и исключения, чтобы быстро выявлять проблемы.
- Минимизируйте объем отправляемых писем — реализуйте проверку, чтобы избежать спама.
Сравнение способов реализации автоматизации при смене статуса заказа
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_order_status_changed | Прямой контроль, все параметры в руках, моментальный запуск | Может замедлить смену статуса при тяжелых операциях | Автоматизация с проверкой переходов и минимальной нагрузкой |
Отложенные задачи через wp_schedule_single_event | Не блокирует смену статуса, хорош для интеграций с API | Сложнее отладить, задержка выполнения | Тяжелые операции, внешние интеграции |
| Плагины автоматизации (например, AutomateWoo) | Простой интерфейс, готовые шаблоны | Может быть избыточным, платным | Для пользователей без навыков программирования |
Итоговый чек-лист для внедрения 'woocommerce_order_status_changed'
- Подключить обработчик с 4 аргументами
- Четко определить переходы статусов для обработки
- Использовать методы объекта
$orderдля безопасного получения данных - Логировать действия для отладки
- Оптимизировать тяжелые операции через отложенные задачи
- Проверить работу на тестовом заказе