Что такое хуки в WooCommerce и зачем они нужны
WooCommerce построен на системе хуков — actions (действия) и filters (фильтры), позволяющих вмешиваться в работу магазина без изменения исходных файлов. Это основной инструмент для кастомизации и автоматизации процессов: от изменения email-сообщений до управления статусами заказов и обновления метаданных продуктов.
Разница между action и filter хуками
- Action — выполняет дополнительный код в определенный момент (например, после создания заказа).
- Filter — изменяет данные перед их выводом или сохранением (например, меняет текст кнопки или цену).
Диагностика: как понять, где применить хуки
Часто задачи автоматизации связаны с повторяющимся поведением, которое нужно упростить или интегрировать с внешними системами. Признаки необходимости хуков:
- Требуется изменить поведение стандартных функций WooCommerce.
- Необходимо добавить дополнительные проверки или действия при изменении статуса заказа.
- Хочется автоматически обновлять или добавлять метаданные продуктов.
Для диагностики стоит включить WP_DEBUG и проверить логи ошибок, а также изучить список доступных хуков в официальной документации WooCommerce: https://docs.woocommerce.com/wc-apidocs/hook-docs.html
Пошаговое решение: пример автоматического добавления скидки при смене статуса заказа
Задача: при смене статуса заказа на "выполнен" автоматически добавить скидку 10% на следующий заказ покупателю.
Шаг 1. Добавить action-хук на смену статуса заказа
add_action('woocommerce_order_status_completed', 'add_discount_for_next_order', 10, 1);Шаг 2. Реализовать функцию добавления скидочного купона покупателю
function add_discount_for_next_order($order_id) {
$order = wc_get_order($order_id);
$user_id = $order->get_user_id();
if (!$user_id) return; // гость — не добавляем
// Создаем уникальный купон
$coupon_code = 'next_order_10_' . $user_id . '_' . time();
$coupon = new WC_Coupon();
$coupon->set_code($coupon_code);
$coupon->set_discount_type('percent');
$coupon->set_amount(10);
$coupon->set_individual_use(true);
$coupon->set_usage_limit(1);
$coupon->set_usage_limit_per_user(1);
$coupon->set_date_expires(strtotime('+30 days'));
$coupon->set_description('Скидка 10% на следующий заказ для пользователя ' . $user_id);
$coupon->save();
// Сохраняем купон в мета пользователя для информирования
update_user_meta($user_id, '_next_order_discount_coupon', $coupon_code);
}Шаг 3. Информационное сообщение для пользователя
Добавим фильтр для отображения уведомления на странице аккаунта:
add_action('woocommerce_account_dashboard', 'show_discount_coupon_message');
function show_discount_coupon_message() {
$user_id = get_current_user_id();
$coupon_code = get_user_meta($user_id, '_next_order_discount_coupon', true);
if ($coupon_code) {
echo '<div class="woocommerce-message">У вас есть скидка 10% на следующий заказ. Используйте купон: <strong>' . esc_html($coupon_code) . '</strong></div>';
}
}Проверка результата после внедрения
- Создайте тестовый заказ и смените его статус на «выполнен» через админку WooCommerce.
- Войдите под пользователем, который делал заказ, и проверьте появление сообщения с купоном в личном кабинете.
- Попробуйте применить купон на странице оформления заказа — должна активироваться скидка 10%.
Частые ошибки и их исправление
- Ошибка: Купон не создается — проверьте, что пользователь авторизован (get_user_id не возвращает 0 для гостей).
- Ошибка: Скидка не применяется — убедитесь, что купон активен и не истек, а также что он не ограничен по товарам или категориям.
- Ошибка: Сообщение не отображается — проверьте, не отключена ли зона видимости хуков для личного кабинета и наличие кода вывода.
Практические советы по безопасности и производительности
- Всегда проверяйте права пользователя перед изменением данных.
- Используйте nonce и проверку capabilities при обработке AJAX или форм.
- Для массовых изменений используйте WP-CLI для выполнения вне веб-запросов.
- Избегайте тяжелых операций в хуках, которые вызываются часто (например, на каждом просмотре страницы).
Сравнение вариантов автоматизации задач WooCommerce
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Код на хуках | Добавление PHP-кода в functions.php или отдельный плагин | Максимальная гибкость, отсутствие нагрузки от плагинов | Требует навыков программирования, риск ошибок при некорректном коде |
| Плагины автоматизации | Использование готовых плагинов (например, AutomateWoo) | Удобный интерфейс, готовые шаблоны, поддержка | Нагрузка на сайт, возможные конфликты, платные функции |
| Внешние сервисы | Интеграция через API и вебхуки | Масштабируемость, автоматизация вне сайта | Сложность настройки, задержки, зависимость от внешних систем |