Как использовать хук woocommerce_order_status_changed для автоматизации в WooCommerce

Диагностика задачи: зачем нужен хук 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)Высокая производительность, масштабируемостьСложная настройка, необходимость дополнительного ПОКрупные проекты, высокая нагрузка
Как использовать WPCommunity для создания сообщества на WordPress
23.03.2026
Как правильно использовать сети REST API в WordPress для сложных проектов
07.01.2026
Как создать динамический фильтрованный список постов в WordPress с помощью WP_Query
02.02.2026
Автоматическое удаление старых transient через transient в WordPress
15.12.2025
Как создать собственный виджет в WordPress с примером кода
28.12.2025