Что такое хук action WooCommerce order status changed и зачем он нужен
Хук woocommerce_order_status_changed срабатывает в момент изменения статуса заказа в WooCommerce. Он передаёт три параметра: ID заказа, старый статус и новый статус. Это идеальная точка для внедрения кастомных действий — например, отправка уведомлений, интеграция с CRM, обновление данных в сторонних системах.
Диагностика проблемы: почему кастомные действия на изменение статуса не работают
Если ваш код на woocommerce_order_status_changed не срабатывает, проверьте:
- Правильно ли добавлен хук — хук должен регистрироваться через
add_actionв functions.php или в плагине. - Передача параметров — функция должна принимать именно три параметра, иначе параметры будут некорректны.
- Не перезаписывается ли хук другими плагинами или темой.
- Активирован ли WooCommerce и не отключен ли этот хук в настройках.
Пошаговое решение: как корректно использовать хук
Пример базового использования хука с логированием изменений статуса заказа:
add_action('woocommerce_order_status_changed', 'wpmake_order_status_changed', 10, 3);
function wpmake_order_status_changed($order_id, $old_status, $new_status) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
error_log("Заказ #" . $order_id . " изменил статус с $old_status на $new_status");
// Добавьте здесь нужные действия
}Для отправки email при переходе заказа в статус "завершён":
add_action('woocommerce_order_status_changed', 'wpmake_notify_on_completed', 10, 3);
function wpmake_notify_on_completed($order_id, $old_status, $new_status) {
if ($new_status !== 'completed') return;
$order = wc_get_order($order_id);
if (!$order) return;
$to = $order->get_billing_email();
$subject = 'Ваш заказ #' . $order_id . ' завершён';
$message = 'Спасибо за покупку! Ваш заказ успешно завершён.';
wp_mail($to, $subject, $message);
}Чек-лист для внедрения кастомных действий по изменению статуса заказа
- Подключите хук с приоритетом и количеством параметров (10, 3).
- Проверяйте валидность ID заказа и объекта заказа.
- Используйте строгие проверки статусов, чтобы не выполнять лишние действия.
- Логируйте ключевые события для отладки.
- Тестируйте на тестовом заказе с разными сценариями.
Проверка результата после внедрения
Чтобы убедиться, что хук работает:
- Создайте тестовый заказ в WooCommerce.
- Измените статус заказа вручную (например, с
processingнаcompleted). - Проверьте логи сервера (error_log) на наличие записей, если вы логировали.
- Убедитесь, что кастомные действия (например, email) были выполнены.
Частые ошибки и как их исправить
- Неверное количество параметров в функции — функция должна принимать 3 параметра. Иначе параметры будут пустыми или некорректными.
- Отсутствие проверки объекта заказа — может привести к фатальным ошибкам, если
wc_get_orderвернёт false. - Использование статусов без префикса — WooCommerce использует статусы без префикса
wc-, напримерcompleted, а неwc-completed. - Конфликт хуков — другие плагины могут вмешиваться, отключать или переназначать хук. Проверяйте в режиме отладки.
Практические советы по безопасности и производительности
- Не выполняйте долгие операции прямо в хук — лучше передавать задачи в очередь или запускать асинхронно.
- Проверяйте права доступа и валидность данных, чтобы не допустить уязвимостей.
- Используйте
error_logтолько для отладки, отключайте на продакшене. - Если отправляете письма, используйте проверенные функции WordPress
wp_mailи убедитесь, что почтовый сервер настроен.
Сравнение способов реализации кастомных действий при смене статуса заказа
| Метод | Простота | Гибкость | Компромиссы |
|---|---|---|---|
Хук woocommerce_order_status_changed в functions.php | Высокая | Высокая | Прямое вмешательство, может запутаться при множестве изменений |
| Плагин с регистрацией хука | Средняя | Высокая | Дополнительный плагин увеличивает нагрузку |
| Отдельный сервис с вебхуком по API WooCommerce | Сложнее | Очень высокая | Нужна настройка внешнего сервера и безопасности |