Что такое хук woocommerce_order_status_changed и зачем он нужен
Хук woocommerce_order_status_changed — это один из ключевых хуков WooCommerce, который вызывается при изменении статуса заказа. Он позволяет запустить нужные действия в момент перехода заказа из одного статуса в другой, например, отправить уведомление, обновить данные, изменить складские остатки или интегрировать с внешними сервисами.
Использование этого хука даёт гибкость в автоматизации бизнес-процессов, снижая необходимость ручного вмешательства в обработку заказов.
Диагностика проблемы: почему автоматизация обработки заказов не работает
Если вы пробовали автоматизировать обработку заказов, используя хуки, но изменения не срабатывают, проверьте следующие моменты:
- Подключается ли ваш код в правильное место, например, в файл
functions.phpтемы или в плагин. - Используется ли правильный синтаксис для хука и функции обратного вызова.
- Совпадают ли статусы заказа, которые вы отслеживаете, с фактическими статусами WooCommerce (например,
processing,completed,on-holdи т.д.). - Нет ли конфликтов с другими плагинами, которые могут перезаписывать статусы или блокировать выполнение вашего кода.
- Активирован ли режим отладки и есть ли ошибки в логах PHP.
Пошаговое решение: пример автоматизации с использованием woocommerce_order_status_changed
1. Подключение функции к хуку
Добавьте следующий код в functions.php вашей активной темы или в свой собственный плагин:
add_action('woocommerce_order_status_changed', 'wp24_handle_order_status_change', 10, 4);
function wp24_handle_order_status_change($order_id, $old_status, $new_status, $order) {
// Проверяем переход статуса со 'processing' на 'completed'
if ($old_status === 'processing' && $new_status === 'completed') {
// Получаем объект заказа
// $order уже передан, но для уверенности можно
if (!$order) {
$order = wc_get_order($order_id);
}
// Выполняем нужные действия: например, отправляем кастомное письмо или обновляем метаданные
// Пример: добавим мета поле с отметкой о выполнении
$order->update_meta_data('_custom_processed', 'yes');
$order->save();
// Логируем событие для отладки
error_log("Заказ #$order_id помечен как обработанный после изменения статуса.");
}
}2. Расширение функции для интеграции с внешним сервисом
Если нужно отправить данные заказа в CRM или другой API, добавьте код внутри условия:
if ($old_status === 'processing' && $new_status === 'completed') {
// Пример запроса к API
$api_url = 'https://example.com/api/order-completed';
$response = wp_remote_post($api_url, [
'body' => json_encode([
'order_id' => $order_id,
'total' => $order->get_total(),
'email' => $order->get_billing_email(),
]),
'headers' => [
'Content-Type' => 'application/json'
]
]);
if (is_wp_error($response)) {
error_log('Ошибка отправки данных заказа в CRM: ' . $response->get_error_message());
}
}Проверка результата после внедрения
- Перейдите в админку WooCommerce и измените статус заказа с
processingнаcompleted. - Проверьте, обновилось ли метаполе
_custom_processedчерез phpMyAdmin или с помощью плагина для просмотра метаданных. - Посмотрите логи PHP (error_log) для сообщений из
error_logв вашем коде. - Если интегрируете с API, проверьте на стороне сервиса получение данных.
Частые ошибки и как их исправить
- Неправильное имя хука или параметров: Убедитесь, что используете именно
woocommerce_order_status_changedи 4 параметра в функции. Ошибки в параметрах приведут к неработающему коду. - Код не подключается: Код должен быть в
functions.phpактивной темы или в плагине, который активен. Проверяйте, что нет синтаксических ошибок. - Статусы заказа не соответствуют: Проверьте, что вы сравниваете правильные статусы, например, 'processing', 'completed'. Можно вывести их в лог для контроля:
error_log("Смена статуса заказа #$order_id: $old_status -> $new_status");- Ошибки при работе с объектом $order: Иногда $order может быть null, поэтому получите его через
wc_get_order($order_id).
Практические советы по безопасности и производительности
- Используйте минимально необходимые права для API-запросов и храните ключи отдельно от кода.
- Для длительных операций применяйте асинхронную обработку (wp_remote_post с non-blocking запросом или очередь задач).
- Логируйте только ошибки и критичные события, чтобы не засорять логи.
- Проверяйте наличие объекта заказа и валидность данных перед выполнением действий.
- Если хотите отключить обработчик, используйте
remove_action.
Сравнение вариантов реализации автоматизации заказа
| Метод | Где реализуется | Преимущества | Недостатки |
|---|---|---|---|
| Хук woocommerce_order_status_changed | functions.php / плагин | Гибкость, доступ к объектам заказа, можно отслеживать любые статусы | Требует навыков PHP, возможны конфликты с плагинами |
| Плагины автоматизации (например, AutomateWoo) | Плагин | Простота настройки, визуальный интерфейс, готовые шаблоны | Платные, нагрузка на сайт, ограниченная гибкость |
| Вебхуки WooCommerce | Настройки WooCommerce | Интеграция с внешними сервисами без кода | Ограниченная логика, нельзя сделать сложную обработку |