Что такое хук woocommerce_order_status_changed и зачем он нужен
Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Он позволяет запускать пользовательские функции при переходе заказа из одного статуса в другой, что удобно для автоматизации бизнес-процессов: отправки уведомлений, обновления метаданных, интеграции с CRM и другими сервисами.
Сигнатура хука
Действие принимает 4 параметра:
$order_id— ID заказа;$old_status— предыдущий статус;$new_status— новый статус;$order— объект WC_Order.
Диагностика: как понять, что хук не срабатывает
Если вы добавили обработчик на woocommerce_order_status_changed, но не видите ожидаемых результатов (например, не отправляются письма, не меняются данные), проверьте следующее:
- Правильно ли подключен код (в functions.php темы или через плагин)?
- Нет ли конфликтов с другими плагинами, которые могут переопределять статусы?
- Используете ли вы правильные имена статусов (например,
processing,completed, а невыполнен)? - Подключена ли отладка — можно вывести
error_logили использовать плагины для логирования событий.
Пошаговое решение: пример автоматизации при смене статуса заказа
Допустим, нужно автоматически добавлять заметку к заказу, когда статус меняется на completed. Создаем функцию и подключаем к хуку:
add_action('woocommerce_order_status_changed', 'wpurok_order_status_changed_handler', 10, 4);
function wpurok_order_status_changed_handler($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
// Добавляем заметку к заказу
$order->add_order_note('Заказ автоматически помечен как выполненный.');
}
}
Чтобы проверить работу, перейдите в админку WooCommerce → Заказы, измените статус вручную на выполнен и убедитесь, что в комментариях заказа появилась заметка.
Пример с отправкой письма при смене статуса на processing
add_action('woocommerce_order_status_changed', 'wpurok_send_custom_email_on_status', 10, 4);
function wpurok_send_custom_email_on_status($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
$to = $order->get_billing_email();
$subject = 'Ваш заказ принят в обработку';
$message = 'Здравствуйте! Ваш заказ №' . $order_id . ' сейчас в обработке.';
wp_mail($to, $subject, $message);
}
}
Проверка результата после внедрения
- Измените статус заказа в админке WooCommerce на нужный;
- Проверьте появление заметок в заказе (если добавляете заметку);
- Проверьте почтовый ящик покупателя для получения писем;
- При необходимости активируйте логирование ошибок в
wp-config.phpдля отладки (define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);); - Используйте плагины типа Query Monitor для отслеживания срабатывания хуков.
Частые ошибки и их исправление
- Неправильные имена статусов. WooCommerce использует английские slug, например,
completed,processing. Использование русских или других вариантов не сработает. - Код не в functions.php или плагине. Если код подключен в неправильном месте (например, в шаблоне), он может не сработать.
- Конфликты с другими плагинами. Некоторые плагины могут отменять стандартные статусы или менять порядок действий.
- Отсутствие параметра 4 в add_action. Для работы с объектом заказа необходимо указать количество параметров — 4, иначе объект не передастся.
Практические советы по безопасности и производительности
- Избегайте тяжелых операций в обработчике хука — длительные запросы к внешним сервисам лучше выполнять через WP-Cron или очереди.
- Проверяйте, что
$order— валидный объектWC_Order, чтобы избежать ошибок. - Используйте nonce и проверки прав при изменении данных заказов через пользовательские запросы.
- Для комплексных интеграций рассмотрите использование асинхронных задач и вебхуков WC.
Сравнение способов автоматизации статусов заказов
| Способ | Преимущества | Недостатки |
|---|---|---|
PHP-хук woocommerce_order_status_changed | Гибкость, полная кастомизация, не требует сторонних плагинов | Требует навыков программирования, возможны конфликты |
| Плагины автоматизации статусов (например, AutomateWoo) | Простота настройки, визуальные правила, интеграции с почтой и CRM | Платные, нагрузка на сайт, ограниченная кастомизация |
| Ручное изменение статусов через админку | Простота, нет кода | Нет автоматизации, требует участия оператора |