Что такое хуки и фильтры в WooCommerce и зачем они нужны
WooCommerce построен на WordPress, а значит использует систему хуков (actions) и фильтров (filters) для изменения поведения без правки исходного кода плагина. Хуки позволяют встраивать свой код в определённые места выполнения, а фильтры — изменять данные перед их выводом или сохранением. Это ключевой инструмент для кастомизации и автоматизации логики интернет-магазина.
Диагностика: как понять, где нужно использовать хуки и фильтры
Прежде чем писать код, важно определить, что именно вы хотите автоматизировать или изменить в WooCommerce. Частые задачи:
- Изменение цены или скидок для конкретных пользователей
- Автоматическая смена статуса заказа при выполнении условий
- Добавление пользовательских метаданных к заказам или товарам
- Модификация вывода информации на странице товара или в корзине
- Отправка дополнительных уведомлений при оформлении заказа
Для диагностики используйте отладчик Query Monitor, включайте WP_DEBUG и смотрите в логи, а также изучайте шаблоны и документацию WooCommerce по хукам: https://docs.woocommerce.com/wc-apidocs/hook-docs.html
Пошаговое решение: примеры автоматизации с хуками и фильтрами
Пример 1. Автоматическое применение скидки 10% для зарегистрированных пользователей
Добавим фильтр на расчет цены корзины, который снижает стоимость на 10% для авторизованных покупателей.
add_action('woocommerce_cart_calculate_fees', 'apply_10_percent_discount_for_logged_in', 20, 1); function apply_10_percent_discount_for_logged_in( $cart ) { if ( is_user_logged_in() && ! is_admin() && ! defined('DOING_AJAX') ) { $discount = $cart->subtotal * 0.1; $cart->add_fee( 'Скидка 10%', -$discount ); } }Пример 2. Автоматическое изменение статуса заказа на "выполнен" при оплате через банковский перевод
Для этого используем action woocommerce_thankyou_{payment_method}.
add_action('woocommerce_thankyou_bacs', 'auto_complete_bacs_order'); function auto_complete_bacs_order( $order_id ) { if ( ! $order_id ) return; $order = wc_get_order( $order_id ); if ( $order->get_status() == 'processing' ) { $order->update_status('completed'); } }Пример 3. Добавление пользовательского поля к заказу и отображение его в админке
Добавим поле "Номер подарочной карты" на страницу оформления заказа и сохраним его в метаданных заказа.
add_action('woocommerce_after_order_notes', 'add_gift_card_field'); function add_gift_card_field( $checkout ) { echo '<div id="gift_card_field"><h2>Подарочная карта</h2>'; woocommerce_form_field( 'gift_card_number', array( 'type' => 'text', 'class' => array('gift-card-number form-row-wide'), 'label' => 'Введите номер подарочной карты', 'placeholder' => '1234-5678-9012', ), $checkout->get_value( 'gift_card_number' ) ); echo '</div>'; } add_action('woocommerce_checkout_update_order_meta', 'save_gift_card_field'); function save_gift_card_field( $order_id ) { if ( ! empty( $_POST['gift_card_number'] ) ) { update_post_meta( $order_id, '_gift_card_number', sanitize_text_field( $_POST['gift_card_number'] ) ); } }Для отображения в админке:
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_gift_card_in_admin', 10, 1 ); function display_gift_card_in_admin( $order ){ $gift_card = get_post_meta( $order->get_id(), '_gift_card_number', true ); if ( $gift_card ) { echo '<p><strong>Номер подарочной карты:</strong> ' . esc_html( $gift_card ) . '</p>'; } }Проверка результата после внедрения
- Для скидки: добавьте товар в корзину под разными учетными записями и проверьте наличие скидки для авторизованных пользователей.
- Для изменения статуса: оформите заказ с оплатой банковским переводом и убедитесь, что статус меняется на «выполнен» после оплаты.
- Для пользовательского поля: заполните поле при оформлении заказа и проверьте, что оно сохраняется и отображается в админке.
Частые ошибки и как их исправить
- Код не выполняется: проверьте, подключён ли файл с кодом (functions.php или плагин), и нет ли синтаксических ошибок.
- Фильтр не влияет на цену: убедитесь, что используете правильный хук —
woocommerce_cart_calculate_feesвызывается после инициализации корзины. - Статус заказа не меняется: проверьте, что условие для статуса и ID оплаты совпадают с реальными значениями.
- Данные из пользовательских полей не сохраняются: проверьте правильность имён полей и наличие
sanitize_text_fieldдля безопасности.
Практические советы по безопасности и производительности
- Используйте проверку
is_admin()иdefined('DOING_AJAX'), чтобы не выполнять код в админке или AJAX-запросах, если это не нужно. - Санитизируйте и валидируйте данные из форм для защиты от XSS и инъекций.
- Минимизируйте использование тяжелых операций в хуках, влияющих на загрузку страницы или оформление заказа.
- Используйте кэширование результатов, если хуки выполняют сложные вычисления.
Сравнение способов автоматизации в WooCommerce
| Метод | Плюсы | Минусы | Пример применения |
|---|---|---|---|
| Использование хуков и фильтров | Гибко, без плагинов, высокая производительность | Требует навыков программирования | Автоматические скидки, смена статусов |
| Плагины автоматизации (например, AutomateWoo) | Удобный интерфейс, много функций без кода | Нагрузка на сайт, платные решения | Комплексные сценарии маркетинга |
| Встроенные настройки WooCommerce | Простота, встроенные функции | Ограниченная гибкость | Простые скидки, уведомления |