Что такое хук woocommerce_order_status_changed и зачем он нужен
Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Это универсальное событие, которое позволяет запускать кастомные функции в момент перехода заказа из одного статуса в другой, например, из «в обработке» в «завершён». С его помощью можно автоматизировать задачи, связанные с обработкой заказов, уведомлениями, интеграцией с внешними системами и т.д.
Диагностика проблем с автоматизацией на основе статусов заказов
Часто сталкиваются с ситуациями, когда автоматические процессы не срабатывают при смене статуса заказа. Причины могут быть следующими:
- Хук вызывается, но функция не подключена или подключена с ошибками
- Неверно переданы параметры функции-обработчика
- Конфликты с другими плагинами, которые перехватывают или изменяют статус без вызова стандартного хука
- Кэширование и оптимизация, блокирующие выполнение PHP-кода (например, объектный кэш)
Пошаговое решение: как правильно использовать хук woocommerce_order_status_changed
1. Подключите обработчик в functions.php или собственном плагине
add_action('woocommerce_order_status_changed', 'wpboard_handle_order_status_change', 10, 4);
function wpboard_handle_order_status_change($order_id, $old_status, $new_status, $order) {
// Проверяем необходимые статусы
if ($old_status === 'processing' && $new_status === 'completed') {
// Ваша логика при переходе из processing в completed
error_log("Заказ #$order_id изменил статус с $old_status на $new_status");
// Пример: отправка кастомного письма
wpboard_send_custom_email($order);
}
}
function wpboard_send_custom_email($order) {
$to = $order->get_billing_email();
$subject = 'Ваш заказ завершён';
$message = 'Спасибо за покупку! Ваш заказ #' . $order->get_id() . ' успешно обработан.';
wp_mail($to, $subject, $message);
}2. Тестирование и отладка
Для проверки работоспособности добавьте error_log или используйте xDebug. Перейдите в админке WooCommerce в заказы и поменяйте статус заказа вручную. В логах PHP должны появиться записи с ID заказа и информацией о смене статуса.
Проверка результата после внедрения
- Измените статус заказа из «в обработке» на «завершён» (processing → completed) вручную
- Проверьте логи сервера (обычно
error.logилиdebug.log) на наличие сообщений, которые вы выводите из обработчика - Проверьте, что кастомное письмо или другая логика отработали (например, письмо пришло на почту клиента)
Частые ошибки и способы их исправления
- Обработчик не вызывается
Проверьте, что код сadd_actionподключён и выполняется. Иногда используется неправильное имя хука или приоритет. Используйте приоритет 10 и 4 аргумента. - Неправильные параметры функции
Хук передаёт 4 аргумента:$order_id,$old_status,$new_status,$order. Убедитесь, что функция принимает их все и в правильном порядке. - Проблемы с кэшированием
Если используется объектный кэш или плагины оптимизации, временно отключите их при отладке, чтобы убедиться, что код выполняется. - Неверные значения статусов
Статусы должны быть в формате WooCommerce: например, 'processing', 'completed', 'on-hold'. Проверьте их через var_dump или в документации WooCommerce.
Практические советы по безопасности и производительности
- Избегайте выполнения тяжёлых операций внутри обработчика, чтобы не замедлять работу сайта. Лучше ставьте задачи в очередь или используйте WP-Cron.
- Проверяйте права доступа и валидируйте данные, особенно если отправляете запросы во внешние сервисы.
- Логируйте ошибки и успешные операции для последующего аудита, но не оставляйте логи в продакшене без необходимости.
- Если отправляете письма, используйте SMTP или специализированные сервисы, чтобы избежать попадания в спам.
Сравнение способов автоматизации изменения статусов заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Хук woocommerce_order_status_changed | Прямой контроль, простота интеграции | Может замедлить заказ при тяжёлых операциях | Для мгновенной реакции на смену статуса |
| WP-Cron с проверкой статусов | Позволяет выполнять задачи асинхронно | Задержка из-за расписания, сложнее отладить | Для длительных процессов или периодических проверок |
| Вебхуки WooCommerce | Подходит для интеграции с внешними сервисами | Зависимость от внешнего сервиса, требует настройки | Для синхронизации с CRM, ERP и т.п. |