Что такое хук 'woocommerce_order_status_changed' и почему он важен
Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Это мощный инструмент для автоматизации: уведомления, интеграции с CRM, изменение метаданных заказа и многое другое. Он заменяет устаревшие хуки по статусам и универсален для любых переходов.
Диагностика: как понять, что хук не срабатывает или работает неправильно
Если ваши автоматические действия при смене статуса заказа не выполняются, нужно проверить:
- Правильно ли зарегистрирован обработчик (функция подключена через
add_action). - Соответствует ли количество и порядок аргументов в функции обработчика.
- Нет ли конфликтов с другими плагинами или темами, которые могут прерывать выполнение.
- Логируются ли ошибки PHP, связанные с функцией.
Для проверки можно добавить временный лог внутри функции:
add_action('woocommerce_order_status_changed', 'my_log_order_status_change', 10, 4);
function my_log_order_status_change($order_id, $old_status, $new_status, $order) {
error_log("Order #$order_id changed from $old_status to $new_status");
}Если в логах ничего нет, значит хук не вызывается или функция не подключена.
Пошаговое решение: как правильно использовать хук для автоматизации
1. Подключение функции с нужным числом аргументов
Хук передает 4 аргумента: ID заказа, старый статус, новый статус и объект заказа. Подключаем функцию так:
add_action('woocommerce_order_status_changed', 'auto_process_order_status', 10, 4);
function auto_process_order_status($order_id, $old_status, $new_status, $order) {
// ваш код
}2. Пример: отправка кастомного уведомления при переходе заказа в статус "completed"
function auto_process_order_status($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
$to = 'manager@example.com';
$subject = "Заказ #$order_id завершен";
$message = "Заказ $order_id изменил статус с $old_status на $new_status.";
wp_mail($to, $subject, $message);
}
}3. Пример: автоматическое добавление пользовательской метки к заказу при переходе в "processing"
function auto_process_order_status($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
update_post_meta($order_id, '_custom_label', 'В обработке');
}
}Как проверить, что автоматизация работает
- Сделайте тестовый заказ в магазине и измените статус вручную или дождитесь автоматического обновления.
- Проверьте логи
error_logили добавьте собственный лог-файл черезfile_put_contents, чтобы убедиться, что функция вызывается. - Проверьте почту, если отправляете уведомления.
- Убедитесь, что метаданные заказа обновились в базе данных (через админку или SQL-запрос).
Частые ошибки при работе с хуком и как их исправить
- Неправильное количество аргументов: Если указать меньше или больше аргументов в
add_action, функция не будет получать нужные параметры. Обязательно указывать 4 аргумента. - Ошибки в коде внутри функции: отсутствие проверок на null, некорректные вызовы методов объекта заказа
$orderмогут приводить к фатальным ошибкам. Используйтеis_a($order, 'WC_Order')для проверки. - Неправильное имя статуса: Статусы пишутся без приставки
wc-, например,completed,processing. Ошибка в названии приводит к срабатыванию условия. - Конфликты с плагинами: Некоторые плагины могут отменять стандартные хуки или перехватывать их. Отключите подозрительные плагины для теста.
Практические советы по безопасности и производительности
- Не используйте тяжелые операции внутри хука напрямую (запросы к внешним API, тяжелые вычисления). Запускайте такие задачи через WP-Cron или очередь.
- Проверяйте права пользователя, если функция вызывается в контексте фронтенда.
- Используйте nonce и фильтры безопасности, если функция меняет данные по запросам пользователя.
- Для логирования используйте отдельный файл, чтобы не засорять общий error_log.
Сравнение способов автоматизации изменения заказов при смене статуса
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Хук woocommerce_order_status_changed | Универсальный, срабатывает на все статусы Передает объект заказа | Нужно правильно обрабатывать аргументы Не подходит для тяжелых задач напрямую | Использовать для легкой логики и триггеров |
Специфичные хуки woocommerce_order_status_$status | Простота для конкретных статусов | Много дублирующего кода при нескольких статусах | Использовать для простых триггеров на один статус |
| Плагины автоматизации (например, AutomateWoo) | Готовые сценарии, визуальный редактор | Нагрузка, лицензии, ограниченные возможности кастомизации | Для сложных бизнес-процессов без кода |