Что такое хук 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
- Добавлен и активирован обработчик со всеми аргументами
- Обработчик проверяет нужные статусы
- Выполняется нужная логика (обновление метаданных, отправка писем, интеграция)
- Проведено тестирование с имитацией смены статуса
- Проверена корректность данных в админке и внешних системах
- Добавлены логи и отладочная информация (если необходимо)
- Обеспечена безопасность и производительность
Сравнение вариантов реализации автоматизации смены статусов WooCommerce
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_order_status_changed | Гибкость, нативный механизм, возможность работать с любыми статусами | Требует навыков PHP, может влиять на производительность при тяжёлой логике | При необходимости кастомной автоматизации и интеграции |
| Плагины автоматизации заказов | Готовые решения, интерфейс без кода | Может быть ограничена по функционалу, нагрузка на сайт | Для типовых задач или при отсутствии навыков разработки |
| Внешние интеграции через вебхуки | Отделение логики от сайта, масштабируемость | Задержки, зависит от внешних сервисов | Для крупного бизнеса и комплексных CRM |