Что такое хуки в WooCommerce и зачем они нужны для заказов
WooCommerce предоставляет множество хуков (actions и filters), которые позволяют вмешиваться в процесс обработки заказов без редактирования исходного кода плагина. Это гибкий способ добавить свою логику, например, автоматическую смену статуса, отправку уведомлений или интеграцию с внешними сервисами.
Для работы с заказами наиболее полезны хуки, связанные с изменением статуса заказа, созданием заказов и обновлением метаданных.
Диагностика: как понять, какой хук использовать
Чтобы выбрать подходящий хук, важно определить, в какой момент жизненного цикла заказа нужно добавить логику:
- Создание заказа —
woocommerce_checkout_order_created - Изменение статуса заказа —
woocommerce_order_status_changed - Обновление метаданных заказа —
woocommerce_update_order
Для диагностики используйте временный лог через error_log() или плагины для логирования, например, Query Monitor, чтобы отследить, когда вызывается нужный хук.
Пошаговое решение: добавление дополнительной логики при смене статуса заказа
Рассмотрим практический пример — отправку кастомного уведомления, когда заказ переводится в статус "выполнен".
add_action('woocommerce_order_status_completed', 'custom_notify_on_order_completed', 10, 1);
function custom_notify_on_order_completed($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
$user_email = $order->get_billing_email();
$subject = 'Ваш заказ выполнен';
$message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' успешно выполнен.';
wp_mail($user_email, $subject, $message);
}Этот код добавляется в файл functions.php вашей дочерней темы или в кастомный плагин.
Расширенная логика: изменение стоимости заказа по условию
Если требуется динамически изменить стоимость заказа, например, применить скидку, можно использовать фильтр woocommerce_calculated_total:
add_filter('woocommerce_calculated_total', 'custom_discount_for_vip_customers', 10, 2);
function custom_discount_for_vip_customers($total, $order) {
$user_id = $order->get_user_id();
if (user_is_vip($user_id)) { // Ваша функция проверки статуса клиента
$discount = 0.1; // 10% скидка
$total = $total * (1 - $discount);
}
return $total;
}Обязательно тестируйте такие изменения на тестовой среде, чтобы избежать конфликтов.
Проверка результата после внедрения
- Создайте тестовый заказ и измените его статус на «выполнен».
- Проверьте, что на указанный e-mail пришло уведомление.
- Для изменения стоимости создайте заказ с пользователем VIP-статуса и проверьте итоговую сумму в админке и корзине.
- Включите WP_DEBUG и используйте
error_log()для отладки.
Частые ошибки и как их исправить
- Хук не срабатывает. Проверьте правильность имени хука и приоритет. Убедитесь, что код добавлен в рабочее место, например, functions.php дочерней темы.
- Ошибка при получении заказа. Используйте
wc_get_order($order_id), а не устаревшие методы. - Почта не отправляется. Проверьте настройки SMTP, используйте плагины вроде WP Mail SMTP для диагностики.
- Изменения не видны в админке. Очистите кэш WooCommerce и кеш сайта.
Практические советы по безопасности и производительности
- Не вызывайте тяжелые операции внутри хуков, которые срабатывают часто — это замедлит сайт.
- Используйте nonce и проверки прав пользователя, если добавляете логику, связанную с изменением данных.
- Для сложных интеграций выносите код в отдельный плагин, чтобы проще управлять и обновлять.
- Логируйте действия только на этапе разработки или при ошибках — избыточное логирование замедляет работу.
Сравнение способов внедрения дополнительной логики в WooCommerce заказах
| Способ | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| Хуки WooCommerce (actions/filters) | Гибкость, не требует изменения ядра, легко обновлять | Требует знаний API, возможны конфликты при неправильном использовании | Добавление логики при изменении заказа, уведомления, скидки |
| Пользовательские плагины | Изоляция кода, удобство поддержки, масштабируемость | Требует разработки с нуля | Сложная логика, интеграция с внешними сервисами |
| Редактирование шаблонов WooCommerce | Визуальные изменения вывода | Не подходит для бизнес-логики, сложно поддерживать при обновлениях | Изменение отображения информации о заказах |