Диагностика задачи: зачем нужен хук woocommerce_order_status_changed
В WooCommerce важно реагировать на изменение статуса заказа для автоматизации бизнес-процессов: отправка уведомлений, интеграция с CRM, изменение данных товаров, управление запасами и т.д. Хук woocommerce_order_status_changed позволяет перехватывать эти события и запускать кастомный код.
Что делает хук woocommerce_order_status_changed
Этот хук вызывается каждый раз, когда статус заказа меняется (например, из «в обработке» в «завершён»). Он принимает 4 параметра:
$order_id— ID заказа$old_status— предыдущий статус (например,processing)$new_status— новый статус (например,completed)$order— объект WC_Order
Используя эти параметры, можно выполнять точечные действия по смене статуса.
Пошаговое решение: пример автоматического отправления данных в CRM при смене статуса на completed
Рассмотрим практический кейс: при переходе заказа в статус completed отправить данные в внешнюю CRM-систему.
1. Добавляем обработчик в functions.php темы или в плагин
add_action('woocommerce_order_status_changed', 'send_order_data_to_crm', 10, 4);
function send_order_data_to_crm($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'completed') {
return; // Действия только при смене на completed
}
// Собираем нужные данные
$data = [
'order_id' => $order_id,
'customer_email' => $order->get_billing_email(),
'total' => $order->get_total(),
'items' => []
];
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$data['items'][] = [
'product_id' => $product->get_id(),
'name' => $product->get_name(),
'quantity' => $item->get_quantity(),
'price' => $product->get_price(),
];
}
// Пример отправки через wp_remote_post в CRM API
$response = wp_remote_post('https://crm.example.com/api/orders', [
'body' => json_encode($data),
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 15,
]);
if (is_wp_error($response)) {
error_log('Ошибка отправки заказа в CRM: ' . $response->get_error_message());
} else {
error_log('Заказ #'. $order_id .' успешно отправлен в CRM.');
}
}2. Где разместить этот код
Лучше всего вынести данный код в специализированный плагин или дочернюю тему, чтобы не потерять изменения при обновлении. Для быстрого теста можно использовать файл functions.php активной темы.
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce.
- Переведите статус заказа вручную в админке в
completed. - Проверьте логи ошибок сервера или дебаг логи WordPress — должен появиться лог успешной отправки или ошибка.
- Проверьте CRM на наличие нового заказа с соответствующими данными.
Частые ошибки и как их исправить
- Хук не срабатывает: убедитесь, что вы используете именно
woocommerce_order_status_changed, а не похожие хуки. Обратите внимание на приоритет и количество аргументов (10, 4). - Неверный статус: статус
completedдолжен быть указан строго как строка. Используйтеvar_dump($new_status)для отладки. - Ошибка при отправке данных: проверьте корректность URL и доступность API CRM, а также настройки SSL и таймауты.
- Ошибка JSON: проверьте структуру данных, используйте
json_last_error_msg()для диагностики.
Практические советы по безопасности и производительности
- Используйте
wp_remote_postс таймаутом и обработкой ошибок, чтобы не блокировать выполнение скриптов. - Не храните в логе чувствительные данные (например, платежные данные или пароли).
- При большом объеме заказов рассмотрите асинхронную отправку через WP-Cron или внешние очереди.
- Если интеграция критична, добавьте повторные попытки отправки при ошибках.
Сравнение подходов отправки данных при смене статуса заказа
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_order_status_changed | Прямой контроль, легко настраивается, встроен в WooCommerce | Выполняется в реальном времени, может замедлить смену статуса при медленной внешней системе | Малый и средний трафик, критичные задачи |
| Отправка через WP-Cron | Асинхронность, не блокирует основной процесс | Зависит от запуска cron, возможны задержки | Большие нагрузки, не критичные задачи |
| Внешние очереди (RabbitMQ, Redis) | Высокая производительность, масштабируемость | Сложная настройка, необходимость дополнительного ПО | Крупные проекты, высокая нагрузка |