Что такое хук woocommerce_order_status_changed и зачем он нужен
Хук woocommerce_order_status_changed срабатывает при изменении статуса заказа в WooCommerce. Он принимает четыре параметра: ID заказа, старый статус, новый статус и объект заказа. Использование этого хука позволяет автоматизировать задачи, связанные с изменениями статуса, например, отправить уведомление, обновить сторонние сервисы или выполнить кастомные действия после оплаты или отмены заказа.
Диагностика: как понять, что хук не срабатывает
Если автоматизация, основанная на этом хуке, не работает, проверьте следующие моменты:
- Подключен ли ваш код (через functions.php или плагин)?
- Правильно ли указан приоритет и количество аргументов в
add_action? - Совпадают ли статусы заказа с ожидаемыми (например,
processing,completed)? - Нет ли конфликтов с другими плагинами, которые могут перехватывать изменения статусов?
Пошаговое решение: пример кода для отправки уведомления при смене статуса на 'completed'
Ниже пример, как отследить, когда заказ переходит в статус completed, и отправить кастомное письмо клиенту:
add_action('woocommerce_order_status_changed', 'custom_on_order_completed', 10, 4);
function custom_on_order_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed' && $old_status !== 'completed') {
$to = $order->get_billing_email();
$subject = 'Ваш заказ завершён';
$message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' успешно завершён.';
wp_mail($to, $subject, $message);
}
}
Разместите этот код в файле functions.php вашей дочерней темы или в собственном плагине.
Как проверить, что код работает
- Создайте тестовый заказ в WooCommerce.
- Измените статус заказа на
completedвручную в админке. - Проверьте, что на электронную почту, указанную в заказе, пришло письмо.
Расширение: обновление стороннего API при смене статуса заказа
Если нужно отправлять данные о смене статуса в сторонний сервис, используйте пример:
add_action('woocommerce_order_status_changed', 'sync_order_status_to_api', 10, 4);
function sync_order_status_to_api($order_id, $old_status, $new_status, $order) {
$api_url = 'https://example.com/api/update-order-status';
$response = wp_remote_post($api_url, [
'body' => json_encode([
'order_id' => $order_id,
'old_status' => $old_status,
'new_status' => $new_status
]),
'headers' => [
'Content-Type' => 'application/json'
]
]);
if (is_wp_error($response)) {
error_log('Ошибка отправки статуса заказа: ' . $response->get_error_message());
}
}
Частые ошибки при работе с хуком woocommerce_order_status_changed
- Неправильное количество аргументов в
add_action: Для получения 4 параметров надо явно указать4в четвертом аргументе функцииadd_action. По умолчанию передаётся 1. - Проверка статусов со строчными буквами: Статусы всегда в нижнем регистре, сравнивайте именно так.
- Проблемы с отправкой почты: Убедитесь, что на сервере настроен SMTP или почтовая функция работает корректно.
- Конфликты с другими плагинами: Некоторые плагины могут менять логику изменения статусов, проверьте отключением других плагинов.
Советы по безопасности и производительности при использовании хука
- Не выполняйте тяжелых операций в хук напрямую — лучше ставьте задачи в очередь (например, через WP-Cron или внешние сервисы).
- Проверяйте входящие данные и используйте логирование для отладки.
- Ограничьте действия только необходимыми статусами, чтобы избежать лишних вызовов.
Сравнение вариантов реализации автоматизации на смену статуса заказа в WooCommerce
| Вариант | Плюсы | Минусы | Пример |
|---|---|---|---|
Использование woocommerce_order_status_changed | Прямой, нативный, гибкий | Требует навыков программирования | Код из статьи |
| Плагин автоматизации (например, AutomateWoo) | Прост в использовании, визуальный интерфейс | Платный, ограниченная кастомизация | Настройка в UI плагина |
| Использование сторонних сервисов (Zapier, Integromat) | Интеграция с внешними сервисами без кода | Зависимость от внешних сервисов, задержки | Webhook + API |