Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Его используют для запуска автоматических действий, например, отправки уведомлений, обновления сторонних сервисов или изменения данных заказа. Это ключевой инструмент для автоматизации бизнес-процессов в интернет-магазине.
Диагностика проблемы: почему автоматизация на смену статуса не работает
Если код на этот хук не срабатывает, вероятные причины:
- Хук подключён неправильно (например, не в
functions.phpили в неподходящем месте); - Используется неправильный синтаксис или параметры в функции обратного вызова;
- Другие плагины или тема конфликтуют и блокируют выполнение;
- Кэширование, которое не пропускает вызов хуков;
- Неправильная проверка статуса внутри функции.
Пошаговое решение: как правильно подключить и использовать хук
1. Подключаем функцию к хуку в файле functions.php вашей темы или в отдельном плагине:
add_action('woocommerce_order_status_changed', 'my_custom_order_status_changed', 10, 4);2. Пишем функцию обратного вызова, которая принимает четыре параметра:
$order_id— ID заказа;$old_status— старый статус заказа;$new_status— новый статус заказа;$order— объект WC_Order.
function my_custom_order_status_changed($order_id, $old_status, $new_status, $order) {
// Например, логируем смену статуса
error_log("Заказ #$order_id изменил статус с $old_status на $new_status");
// Действие только при смене на 'completed'
if ($new_status === 'completed') {
// Добавляем заметку к заказу
$order->add_order_note('Заказ автоматически помечен как выполненный.');
// Отправляем кастомное письмо
$mailer = WC()->mailer();
$mails = $mailer->get_emails();
if (!empty($mails['WC_Email_Customer_Completed_Order'])) {
$mails['WC_Email_Customer_Completed_Order']->trigger($order_id);
}
}
}Проверка результата: как убедиться, что код сработал
- Посмотрите логи сервера на наличие записи, добавленной через
error_log. Если лога нет — код не сработал. - Перейдите в админку WooCommerce, откройте заказ и проверьте наличие заметки, добавленной вашей функцией.
- Проверьте почтовый ящик, указанный в заказе, на наличие письма о смене статуса.
- Для отладки можно временно добавить вывод через
wp_mailилиerror_logв ключевых местах.
Частые ошибки и как их исправить
- Функция не вызывается — убедитесь, что
add_actionвызван в правильном месте и нет синтаксических ошибок. - Использование неправильного количества параметров — хук принимает 4 параметра, нужно задать это в
add_action(четвёртый параметр). - Проблемы с кешированием — если вы используете кеширующие плагины (например, LiteSpeed Cache), отключите кеш для страниц админки и страниц заказа, чтобы хук срабатывал корректно.
- Конфликты с другими плагинами — временно отключите другие плагины, чтобы проверить влияние.
Практические советы по безопасности и производительности
- Не выполняйте в хуке тяжёлые операции (например, вызовы внешних API) напрямую. Используйте WP Cron или очередь задач.
- Проверяйте тип и валидность данных перед использованием в функции.
- Для крупных магазинов логируйте действия в отдельный файл, чтобы не засорять стандартный лог PHP.
- Избегайте дублирования действий при повторных вызовах хука.
Сравнение способов реализации автоматизации на смену статуса заказа
| Метод | Плюсы | Минусы |
|---|---|---|
Прямое использование woocommerce_order_status_changed | Гибкость, полный контроль, отсутствие дополнительных плагинов | Требует знания PHP, возможны ошибки при неправильном коде |
| Плагины автоматизации (например, AutomateWoo) | Удобный UI, готовые шаблоны, поддержка без кода | Нагрузка на сайт, лицензии, ограниченная кастомизация |
| Кастомный плагин с WP Cron для отложенных задач | Отложенное выполнение, не влияет на скорость заказа | Усложнённая реализация, требуется настройка WP Cron |