Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed срабатывает при изменении статуса заказа в WooCommerce. Он принимает четыре параметра: ID заказа, старый статус, новый статус и объект заказа. Этот хук незаменим для автоматизации процессов — например, отправки уведомлений, интеграции с CRM или управления складом.
Сигнатура хука
do_action( 'woocommerce_order_status_changed', int $order_id, string $old_status, string $new_status, WC_Order $order )Диагностика: как понять, что хук не работает
Если автоматические действия, привязанные к смене статуса заказа, не выполняются, проверьте:
- Подключен ли ваш обработчик к хуку именно
woocommerce_order_status_changed. - Правильно ли используются параметры в функции обратного вызова.
- Нет ли конфликтов с другими плагинами или темой.
- Вызывается ли смена статуса через стандартные методы WooCommerce.
Для отладки добавьте логирование:
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 );Если в логе нет записей, значит хук не срабатывает — возможно, статус меняется нестандартным способом.
Пошаговое решение: автоматизация на примере отправки письма при смене статуса на "completed"
1. Создание функции-обработчика
function send_email_on_order_completed( $order_id, $old_status, $new_status, $order ) {
if ( 'completed' === $new_status && 'completed' !== $old_status ) {
$to = $order->get_billing_email();
$subject = 'Спасибо за покупку! Ваш заказ завершен';
$message = 'Здравствуйте, ваш заказ №' . $order_id . ' был успешно завершен.';
wp_mail( $to, $subject, $message );
}
}2. Привязка функции к хуку
add_action( 'woocommerce_order_status_changed', 'send_email_on_order_completed', 10, 4 );3. Проверка работы
Перейдите в админку WooCommerce, измените статус заказа на completed. Если письмо не приходит, проверьте логи почты, конфигурацию SMTP и правильность email покупателя.
Проверка результата после внедрения
- Измените статус заказа на «выполнен» в админке.
- Проверьте, что email приходит на указанный в заказе адрес.
- Просмотрите логи сервера на наличие ошибок, связанных с
wp_mail().
Частые ошибки и как их исправить
- Функция не вызывается: Проверьте, что функция подключена в файле темы (functions.php) или плагина и что хук используется с правильным названием и параметрами.
- Письмо не отправляется: Убедитесь, что почтовая функция
wp_mailработает на сервере. Для теста можно использовать плагин SMTP или написать тестовую отправку. - Параметры функции не совпадают: Всегда указывайте количество аргументов в
add_action— 4 для этого хука. - Конфликты с другими плагинами: Отключите временно другие плагины и проверьте работу.
Практические советы по безопасности и производительности
- Не используйте тяжелые операции внутри хука напрямую — если нужно, запускайте задачи в фоне через WP-Cron или очереди.
- Проверяйте права пользователя перед изменением статуса, чтобы исключить нежелательные действия.
- Для логирования используйте условие
defined('WP_DEBUG') && WP_DEBUG, чтобы не засорять логи на продакшене. - Используйте проверку
if ( ! $order instanceof WC_Order )внутри функции для избежания ошибок.
Сравнение способов автоматизации при смене статуса заказа
| Способ | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_order_status_changed | Обработка любых смен статусов с доступом к объекту заказа | Гибкость, полный контроль, можно реагировать на любые статусы | Требует навыков PHP, возможны ошибки в логике |
| Плагины автоматизации | Готовые решения для автоматизации почты и задач | Простота настройки, нет кода | Могут быть тяжеловесными, ограничены функционалом |
| Вебхуки WooCommerce | Отправка данных в сторонние сервисы при смене статуса | Интеграция с внешними системами | Не подходит для локальных задач, требует знания API |