Диагностика задачи: зачем нужен хук 'woocommerce_order_status_changed'
В WooCommerce часто требуется запускать определённые действия при смене статуса заказа — например, отправлять уведомления, обновлять сторонние сервисы, запускать внутренние процессы. Хук woocommerce_order_status_changed позволяет перехватить это событие и выполнить кастомный код.
Проверить, срабатывает ли хук, можно, добавив простой лог или уведомление:
add_action('woocommerce_order_status_changed', function($order_id, $old_status, $new_status, $order) {
error_log("Order #$order_id status changed from $old_status to $new_status");
}, 10, 4);После смены статуса заказа в логе сервера должна появиться соответствующая запись.
Пошаговое решение: как реализовать автоматизацию
1. Подключаем хук и принимаем параметры
Хук предоставляет четыре аргумента:
$order_id— ID заказа$old_status— предыдущий статус$new_status— новый статус$order— объект WC_Order
Подключаемся, указав 4 параметра:
add_action('woocommerce_order_status_changed', 'my_custom_order_status_action', 10, 4);
function my_custom_order_status_action($order_id, $old_status, $new_status, $order) {
// ваш код
}2. Добавляем условие для конкретного перехода
Например, хотим выполнить действие, когда заказ меняет статус с processing на completed:
if ($old_status === 'processing' && $new_status === 'completed') {
// выполняем автоматизацию
}3. Пример: отправка кастомного email при смене статуса
Отправим письмо клиенту с дополнительной информацией:
if ($old_status === 'processing' && $new_status === 'completed') {
$to = $order->get_billing_email();
$subject = 'Ваш заказ завершён';
$message = 'Здравствуйте! Ваш заказ #' . $order_id . ' успешно завершён. Спасибо за покупку.';
wp_mail($to, $subject, $message);
}4. Пример: интеграция с внешним API
Отправим данные заказа в CRM при смене на статус completed:
if ($new_status === 'completed') {
$data = [
'order_id' => $order_id,
'total' => $order->get_total(),
'email' => $order->get_billing_email(),
];
wp_remote_post('https://example-crm.ru/api/order', [
'body' => json_encode($data),
'headers' => ['Content-Type' => 'application/json'],
]);
}Проверка результата после внедрения
- Сделайте тестовый заказ в WooCommerce
- Переведите заказ в нужный статус (например, из
processingвcompleted) вручную в админке - Проверьте логи сервера, почту, внешние сервисы — должны появиться ожидаемые действия
- Для отладки используйте
error_log()или плагины для логирования (например, WP Log Viewer)
Частые ошибки и как их исправить
- Хук не срабатывает
— Убедитесь, что статус действительно меняется именно через WooCommerce, а не напрямую в базе.
— Проверьте, что функция подключена и нет конфликтов с другими плагинами. - Отсутствие параметров в функции
— Обязательно укажите количество принимаемых параметров вadd_action(четыре в нашем случае). - Почта не отправляется
— Проверьте работу функцииwp_mailотдельно.
— Убедитесь в корректности SMTP настроек сервера. - Ошибки в запросах к API
— Проверьте URL и формат данных.
— Используйте функциюwp_remote_getилиwp_remote_postс правильными заголовками.
Практические советы по безопасности и производительности
- Не выполняйте тяжёлые операции напрямую в хуке — лучше использовать отложенный запуск через WP-Cron или очереди для масштабируемости.
- Обрабатывайте ошибки внешних вызовов (API) и логируйте неудачи.
- Если отправляете письма, используйте проверенные SMTP сервисы для надежности.
- Избегайте дублирования действий при повторных сменах статуса — храните флаги в метаданных заказа.
Сравнение способов автоматизации при смене статуса заказа
| Метод | Преимущества | Недостатки |
|---|---|---|
Хук woocommerce_order_status_changed | Прямой доступ к изменению статуса, множество параметров | Вызов при каждом изменении, может тормозить при тяжёлых задачах |
| WP-Cron с проверкой статусов | Асинхронность, можно планировать задачи | Задержки срабатывания, зависит от посещений сайта |
| Вебхуки WooCommerce | Интеграция с внешними сервисами без кода | Ограничена настраиваемость, нужен внешний обработчик |