Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Он принимает четыре аргумента: ID заказа, старый статус, новый статус и объект заказа. Это позволяет запускать автоматические процессы в зависимости от смены статуса — например, отправлять уведомления, обновлять внешние сервисы или изменять данные заказа.
Диагностика: как понять, что хук срабатывает
Чтобы убедиться, что хук работает, можно временно добавить простую запись в лог:
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);После смены статуса заказа проверьте файл debug.log в каталоге wp-content (при включённом WP_DEBUG_LOG). Если запись появилась, значит хук подключен и срабатывает корректно.
Пошаговое решение: автоматизация отправки письма при смене статуса на "completed"
Рассмотрим типичную задачу — отправка кастомного уведомления клиенту, когда заказ переходит в статус completed.
1. Подключаем хук с проверкой статуса
add_action('woocommerce_order_status_changed', 'send_custom_email_on_completed', 10, 4);
function send_custom_email_on_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed' && $old_status !== 'completed') {
$to = $order->get_billing_email();
$subject = 'Спасибо за ваш заказ!';
$message = 'Ваш заказ #' . $order_id . ' успешно выполнен. Благодарим за покупку!';
wp_mail($to, $subject, $message);
}
}2. Проверяем отправку письма
Советую добавить логирование отправки, чтобы убедиться в работе:
if (wp_mail($to, $subject, $message)) {
error_log("Custom email sent for order #$order_id");
} else {
error_log("Failed to send custom email for order #$order_id");
}После смены статуса на completed проверьте, что письмо пришло и в логе появилась запись об успешной отправке.
Как проверить результат после внедрения
- Создайте тестовый заказ в WooCommerce.
- Переведите статус заказа в админке в
completed. - Проверьте почту, указанную в заказе — должно прийти письмо с вашим сообщением.
- Просмотрите
debug.logдля подтверждения срабатывания хука и успешной отправки письма.
Частые ошибки при работе с хуком и их исправление
- Хук не срабатывает: проверьте, что код добавлен в файл
functions.phpактивной темы или в плагин. Убедитесь, что нет конфликтов с другими плагинами. - Письмо не отправляется: убедитесь, что функция
wp_mailкорректно настроена на вашем сервере, нет блокировок SMTP и почтового сервиса. - Проверка статусов сделана неверно: используйте точное сравнение статусов, учитывайте, что статусы — это строки, например
'completed','processing'.
Практические советы по безопасности и производительности
- Не запускайте тяжёлые операции в хук напрямую — если нужно, используйте
wp_schedule_single_eventдля отложенного выполнения. - Всегда фильтруйте и валидируйте данные, получаемые из объекта заказа.
- Для отправки писем используйте специализированные SMTP-плагины, чтобы избежать попадания в спам.
- Логирование включайте только для отладки, чтобы не засорять логи в продакшене.
Сравнение вариантов реализации автоматизации на хуке 'woocommerce_order_status_changed'
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Прямое выполнение в хуке | Просто и быстро реализуется | Риск замедления заказа, если операции тяжёлые | Лёгкие уведомления, небольшие действия |
| Отложенное выполнение через WP Cron | Не блокирует основной поток, можно запускать тяжелые задачи | Зависит от настроек крон и нагрузки сервера | Обработка больших данных, интеграция с внешними API |
| Использование сторонних плагинов для автоматизации | Готовые решения, удобный интерфейс | Может быть избыточно, нагрузка, зависимость от плагина | Если нужно без кода и быстро |