Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Хуки: действия и фильтры

Хук — именованная точка в коде WooCommerce, к которой подключают свои функции. Хуки бывают двух видов: действие что-то делает в нужный момент, фильтр изменяет значение и возвращает его. Почти любая доработка магазина начинается с вопроса «к какому хуку подключиться».

Действие

Действие подключают функцией add_action(). Допишите в includes/storefront.php:

// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_thankyou', function (int $orderId) {
    echo '<p>Мы позвоним вам в течение часа.</p>';
});

WooCommerce вызывает хук woocommerce_thankyou на странице «Заказ принят» и передаёт номер заказа. Оформите тестовый заказ — абзац появится под сведениями о заказе. Действие ничего не возвращает: оно выводит текст, отправляет письмо, пишет в базу.

Фильтр

Фильтр подключают функцией add_filter(). Он получает значение, меняет его и обязан вернуть:

// wp-content/plugins/acme-shop/includes/storefront.php
add_filter('woocommerce_product_single_add_to_cart_text', function (string $text): string {
    return 'Купить';
});

На странице товара кнопка «В корзину» теперь называется «Купить». Если забыть return, кнопка останется без текста.

Приоритет и аргументы

У add_action() и add_filter() есть ещё два параметра: приоритет и число аргументов.

// wp-content/plugins/acme-shop/includes/storefront.php
add_filter('woocommerce_get_price_html', function (string $html, WC_Product $product): string {
    return $product->is_on_sale() ? $html . ' <small>акция</small>' : $html;
}, 20, 2);

Приоритет 20 означает «выполнить позже стандартных функций»: по умолчанию он равен 10, меньшее число выполняется раньше. Число 2 говорит, что функция принимает два аргумента — без него WordPress передаст только первый. У товаров со скидкой рядом с ценой появится слово «акция».

Отключение чужой функции

Подключённую функцию можно снять — тем же именем и приоритетом:

// wp-content/plugins/acme-shop/includes/storefront.php
add_action('init', function () {
    remove_action('woocommerce_before_shop_loop', 'woocommerce_result_count', 20);
});

Со страницы каталога исчезнет строка «Отображение 1–12 из 40». Снимать функции нужно после того, как WooCommerce их подключил, поэтому вызов обёрнут в хук init.

Как найти хук

СпособКак
ШаблонОткройте файл в woocommerce/templates/ и найдите do_action(
Поиск по кодуИщите apply_filters( рядом с нужным значением
ДокументацияСправочник хуков на developer.woocommerce.com
Плагин Query MonitorПоказывает хуки, сработавшие на текущей странице

Например, в templates/single-product/add-to-cart/simple.php перед кнопкой стоит do_action('woocommerce_before_add_to_cart_button') — значит, свой блок перед кнопкой подключают к этому хуку.

Частые хуки

ХукВидГде срабатывает
woocommerce_before_shop_loopдействиеНад списком товаров
woocommerce_single_product_summaryдействиеПравая колонка страницы товара
woocommerce_thankyouдействиеСтраница «Заказ принят»
woocommerce_get_price_htmlфильтрHTML цены товара
loop_shop_per_pageфильтрЧисло товаров на странице каталога

Частая ошибка

В фильтре пишут echo вместо return. Текст выводится в случайном месте страницы — там, где фильтр был вызван, — а само значение становится пустым. Действие выводит, фильтр возвращает: по названию функции add_action или add_filter всегда понятно, что требуется.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.