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

Что такое хук woocommerce_order_status_changed и зачем он нужен

Хук woocommerce_order_status_changed запускается при изменении статуса заказа в WooCommerce. Он позволяет автоматически выполнять код при переходе заказа между статусами, например, из в обработке в завершён. Это удобно для интеграций, уведомлений, обновления данных и других бизнес-процессов.

Аргументы хука

  • $order_id – ID заказа
  • $old_status – предыдущий статус заказа
  • $new_status – новый статус заказа
  • $order – объект WC_Order

Диагностика задачи: почему нужен автоматический код при смене статуса

Допустим, требуется:

  • Отправить дополнительное письмо клиенту после завершения заказа
  • Автоматически обновить метаполя заказа
  • Интегрировать смену статуса с внешней CRM или складом
  • Вести логи изменений статусов для аудита

Без автоматизации это значит вручную отслеживать и обновлять каждую операцию, что неудобно и чревато ошибками.

Пошаговое решение: реализация обработчика хука

1. Добавляем обработчик в файл functions.php темы или в отдельный плагин

add_action('woocommerce_order_status_changed', 'wpzen_handle_order_status_change', 10, 4);
function wpzen_handle_order_status_change($order_id, $old_status, $new_status, $order) {
    // Проверяем переход в статус 'completed'
    if ($new_status === 'completed') {
        // Добавляем метаполе с датой завершения
        $order->update_meta_data('_completed_date', current_time('mysql'));
        $order->save();

        // Отправляем дополнительное письмо клиенту
        $mailer = WC()->mailer();
        $mails = $mailer->get_emails();
        if (!empty($mails['WC_Email_Customer_Completed_Order'])) {
            $mails['WC_Email_Customer_Completed_Order']->trigger($order_id);
        }
    }
}

2. Объяснение кода

  • Функция слушает смену любого статуса заказа
  • Если новый статус равен completed, добавляет метаданные с датой
  • Вызывает встроенное письмо WooCommerce о выполнении заказа

3. Интеграция с CRM (пример)

add_action('woocommerce_order_status_changed', 'wpzen_send_order_to_crm', 20, 4);
function wpzen_send_order_to_crm($order_id, $old_status, $new_status, $order) {
    if ($new_status === 'processing') {
        $data = [
            'order_id' => $order_id,
            'total' => $order->get_total(),
            'customer_email' => $order->get_billing_email(),
            'items' => []
        ];

        foreach ($order->get_items() as $item) {
            $data['items'][] = [
                'product_id' => $item->get_product_id(),
                'quantity' => $item->get_quantity()
            ];
        }

        // Отправка POST запроса в CRM
        wp_remote_post('https://crm.example.com/api/orders', [
            'body' => json_encode($data),
            'headers' => ['Content-Type' => 'application/json'],
            'timeout' => 10
        ]);
    }
}

Проверка результата после внедрения

  • Создайте тестовый заказ в WooCommerce
  • Измените его статус вручную через админку на completed
  • Проверьте, что в метаданных заказа появилось поле _completed_date с текущей датой (через вкладку «Дополнительные поля» или с помощью плагина «WP phpMyAdmin»)
  • Убедитесь, что клиент получил письмо о завершении заказа
  • Если настроена интеграция с CRM, проверьте логи на стороне CRM или используйте инструменты дебага HTTP-запросов

Частые ошибки и как их исправить

  • Ошибка: обработчик не срабатывает
    Причина: функция не подключена, либо хук неправильно указан
    Решение: проверить подключение к functions.php, убедиться, что хук woocommerce_order_status_changed используется с правильным количеством аргументов (4)
  • Ошибка: письмо не отправляется
    Причина: письмо отключено в настройках WooCommerce или неверный вызов
    Решение: проверить, включено ли письмо "Завершённый заказ" в WooCommerce > Настройки > Email; использовать стандартный метод trigger() у класса письма
  • Ошибка: интеграция с API CRM не работает
    Причина: неправильный URL, ошибки авторизации, таймауты
    Решение: проверить URL, добавить логи в функцию, увеличить таймаут

Практические советы по безопасности и производительности

  • Используйте wp_remote_post с ограничением таймаута, чтобы не блокировать сайт при длительном запросе
  • Чтобы избежать нагрузки, отключайте обработчик, если статус не интересует
  • Для больших объёмов заказов стоит реализовать очередь или cron-задачи для интеграций
  • Не храните чувствительные данные в метаполях без шифрования
  • Регулярно тестируйте работу хука на тестовом стенде перед запуском на продакшене

Чек-лист внедрения автоматизации на основе woocommerce_order_status_changed

  1. Добавлен и активирован обработчик со всеми аргументами
  2. Обработчик проверяет нужные статусы
  3. Выполняется нужная логика (обновление метаданных, отправка писем, интеграция)
  4. Проведено тестирование с имитацией смены статуса
  5. Проверена корректность данных в админке и внешних системах
  6. Добавлены логи и отладочная информация (если необходимо)
  7. Обеспечена безопасность и производительность

Сравнение вариантов реализации автоматизации смены статусов WooCommerce

СпособПлюсыМинусыКогда использовать
Хук woocommerce_order_status_changedГибкость, нативный механизм, возможность работать с любыми статусамиТребует навыков PHP, может влиять на производительность при тяжёлой логикеПри необходимости кастомной автоматизации и интеграции
Плагины автоматизации заказовГотовые решения, интерфейс без кодаМожет быть ограничена по функционалу, нагрузка на сайтДля типовых задач или при отсутствии навыков разработки
Внешние интеграции через вебхукиОтделение логики от сайта, масштабируемостьЗадержки, зависит от внешних сервисовДля крупного бизнеса и комплексных CRM
Как ускорить загрузку изображений в WordPress с помощью lazy load и оптимизации
17.04.2026
Как убрать верхний футер в теме WordPress
11.12.2025
Как использовать хуки для динамического изменения заголовков страниц в WordPress
18.01.2026
WooCommerce: автоматическое удаление неактивных заказов через Cron и PHP
18.06.2026
WooCommerce: автоматическое удаление неактивных заказов с помощью Cron и PHP
17.06.2026