Диагностика проблемы: зачем нужен хук 'woocommerce_order_status_changed'
В WooCommerce часто требуется выполнять дополнительные действия при смене статуса заказа. Например, отправить нестандартное уведомление, интегрировать с CRM, обновить складские остатки или запускать кастомные процессы. Без правильного использования хука изменения статуса заказов автоматизация становится сложной и неэффективной.
Пошаговое решение: как применить 'woocommerce_order_status_changed'
1. Подключение хука в functions.php
Хук woocommerce_order_status_changed передает 4 параметра: ID заказа, старый статус, новый статус и объект заказа. Для подключения создайте функцию и добавьте её к хуку:
add_action('woocommerce_order_status_changed', 'my_custom_order_status_change', 10, 4);
function my_custom_order_status_change($order_id, $old_status, $new_status, $order) {
// Проверяем переход от 'pending' к 'processing'
if($old_status === 'pending' && $new_status === 'processing') {
// Ваш код автоматизации
}
}
2. Пример: отправка кастомного письма при смене статуса
Добавим отправку уведомления администратору, когда заказ перейдет в статус 'completed':
add_action('woocommerce_order_status_changed', 'notify_admin_on_completed_order', 10, 4);
function notify_admin_on_completed_order($order_id, $old_status, $new_status, $order) {
if($new_status === 'completed') {
$to = get_option('admin_email');
$subject = 'Заказ №' . $order_id . ' выполнен';
$message = 'Заказ #' . $order_id . ' был отмечен как выполненный.';
wp_mail($to, $subject, $message);
}
}
Проверка результата после внедрения
Чтобы убедиться, что хук работает корректно, выполните следующие шаги:
- Создайте тестовый заказ с оплатой «наложенным платежом» или другим способом, чтобы статус изначально был
pending. - В админке WooCommerce смените статус заказа вручную на
processingилиcompletedв зависимости от вашего сценария. - Проверьте логи почты (если отправляете уведомления) или результаты интеграции (например, записи в базе или вызовы API).
- Для отладки можно добавить
error_log()с сообщением внутри функции, чтобы увидеть вызов в логах PHP.
Частые ошибки и как исправить
- Ошибка: не срабатывает хук. Проверьте, что функция подключена правильно и файл с кодом загружается. Хук должен быть добавлен до запуска событий WooCommerce.
- Ошибка: неправильные параметры в функции. Убедитесь, что указано 4 параметра в add_action (четвёртый параметр - количество аргументов).
- Ошибка: отправка почты не происходит. Проверьте настройки почтового сервера WordPress, используйте плагины для логирования почты или wp_mail_debug.
- Ошибка: слишком тяжелые операции внутри хука. Для длительных задач используйте WP Cron или асинхронные задачи, чтобы не замедлять работу сайта.
Практические советы по безопасности и производительности
- Всегда проверяйте права пользователя, если функция изменяет данные.
- Избегайте тяжелых запросов и блокирующих операций внутри хука — лучше делегировать их WP Cron или внешним сервисам.
- Используйте nonce и проверяйте входные данные, если функция обрабатывает пользовательский ввод.
- Логируйте ключевые события для упрощения отладки и мониторинга.
Сравнение вариантов реализации автоматизации изменения статуса заказа
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Хук 'woocommerce_order_status_changed' | Нативный, точечный, легко интегрировать | Нужно писать код, возможны ошибки при сложной логике | Отправка кастомных уведомлений |
| Плагины автоматизации (например, AutomateWoo) | Готовые сценарии, визуальный интерфейс | Платные, ограничены по кастомизации | Автоматические email и SMS |
| WP Cron с кастомными задачами | Отложенное выполнение тяжелых задач | Зависит от посещаемости сайта | Обработка интеграций с внешними API |