Диагностика задачи: зачем нужен хук изменения статуса заказа
В WooCommerce нередко возникает необходимость выполнять действия при смене статуса заказа — например, отправить уведомление, обновить внешнюю систему, изменить метаданные заказа или добавить кастомную логику бизнес-процесса. WooCommerce предоставляет специализированный хук woocommerce_order_status_changed, который срабатывает при любом изменении статуса заказа. Правильное использование этого хука позволяет надежно интегрировать дополнительный функционал без модификации ядра.
Пошаговое решение: как подключить и использовать хук
1. Подключение к хуку в functions.php или плагине
Добавьте следующий код в файл functions.php вашей активной темы или в кастомный плагин:
add_action('woocommerce_order_status_changed', 'custom_order_status_changed', 10, 4);
function custom_order_status_changed($order_id, $old_status, $new_status, $order) {
// Проверяем, например, переход со статуса 'pending' на 'processing'
if ($old_status === 'pending' && $new_status === 'processing') {
// Ваша логика
error_log("Заказ #{$order_id} изменил статус с {$old_status} на {$new_status}");
// Например, отправка кастомного уведомления
$to = 'manager@example.com';
$subject = "Заказ #{$order_id} перешел в обработку";
$message = "Проверьте заказ #{$order_id} в панели WooCommerce.";
wp_mail($to, $subject, $message);
}
}2. Пояснения к параметрам функции
$order_id— ID заказа;$old_status— предыдущий статус (например, 'pending');$new_status— новый статус (например, 'processing');$order— объект WC_Order с полным набором данных заказа.
Проверка результата после внедрения
Чтобы проверить, что хук работает корректно:
- Перейдите в админку WooCommerce и измените статус одного из заказов с
pendingнаprocessing. - Проверьте логи PHP (например,
error_log), там должна появиться запись о смене статуса. - Проверьте почту, если отправляете уведомления — письмо должно прийти.
Для отладки можно добавить временный вызов error_log(print_r($order, true)); чтобы убедиться, что объект заказа передается корректно.
Частые ошибки и как исправить
- Хук не срабатывает: убедитесь, что код действительно подключен (например, в активной теме или плагине), и что при изменении статуса заказ сохраняется через админку WooCommerce, а не напрямую в базе.
- Почта не отправляется: проверьте настройки SMTP, используйте плагины типа WP Mail SMTP для отладки отправки писем.
- Неверные статусы в условии: используйте точные строковые значения статусов, например,
pending,processing,completed. Для проверки вызовитеwc_get_order_statuses().
Практические советы по производительности и безопасности
- Если логика сложная — не выполняйте тяжелые операции в хуке напрямую, а делегируйте их в очередь задач WP Cron или внешние сервисы.
- Используйте проверки прав доступа, если данные заказа отправляются во внешние системы.
- Для отправки почты лучше использовать асинхронные методы или специализированные SMTP-сервисы, чтобы не замедлять обработку запроса.
Сравнение подходов: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php или плагине | Полный контроль, гибкость, нет лишних зависимостей | Требует навыков программирования, риск ошибок при обновлениях |
| Плагины для кастомной логики (например, AutomateWoo) | Простая настройка, визуальные интерфейсы, поддержка | Нагрузка на сайт, стоимость, ограниченная гибкость |