WooCommerce: Поиск по категориям

Задача. Сделать поиск товаров в WooCommerce по категориям. В поле поиска должен присутствовать выпадающий список из которого можно выбрать категорию в которой необходимо произвести поиск товара или выбрать поиск по всем категориям, как на Изображении №1.

Поиск по категориям на сайте с WooCommerce
Изображение №1. Поиск по категориям в Woocommerce

Решение 1. В файле product-searchform.php нужно заменить форму поиска формой из кода №1 и добавить стилистическое оформление для поля поиска в файл стилей из кода №2 или свой.

Алгоритм добавления поиска по категориям:

  1. Если еще не скопирован, копируем файл формы поиска из папки плагина /site.ru/wp-content/plugins/woocommerce/templates/product-searchform.php в папку с темой /ваша_тема/woocommerce/product-searchform.php (для сохранения настроек при обновлении плагина).
  2. Заменить форму поиска формой из кода №1.
  3. Добавить стили из кода №2 (или свои) в файл стилей style.css.
Код №1: Форма поиска по категориям
Код №2: Стили для формы

Поиск по категориям на тестовом сайте
Результат формы поиска по категориям на тестовом сайте

Решение 2. Аналогичное решение первому. Изменяем файл формы поиска и через хук в functions.php изменяем вывод товаров в зависимости от категории. Можно и не через файл формы поиска, а, например, вывести отдельным файлом, добавив на сайт через шорткод.

Алгоритм второго варианта добавления поиска по категориям:

  1. Заменить форму поиска формой из кода №3 в /ваша_тема/woocommerce/product-searchform.php.
  2. Изменить вывод товаров в зависимости от выбранной категории через хук pre_get_posts. Вставляем код №3 в файл functions.php.
Код №3: Форма поиска по категориям
Код №4: Вывод товаров в зависимости от выбранной категории в functions.php
Если изменить в строке taxonomy=product_cat& кода №3 product_cat на category, то вместо категорий товаров будут рубрики постов.
В строке Кода №4 'hide_empty=0&depth=1&selected=' depth=1 — это параметр вложенности категорий, т.е. при 1 в выпадающий список не попадают подкатегории. Если нужны и подкатегории нужно указать depth=2.
Важно! На большом проекте (более 30 тыс товаров), используя решения 1 и 2, очень долго обрабатывались запросы по поиску [на небольших сайтах было все нормально]. Решение нашлось для случая Решения №2, путем исключения из запроса типа поста post_type=product. Т.е. при использовании обоих кодов url после поиска будет примерно такой site.ru/?s=word_request&post_type=product&cat=63&submit=search. Исключаем post_type=product — в инпуте Кода №3 input type="hidden" name="post_type" value="product" убираем значения «product» и «post_type«, параметры остаются пустыми.
Ссылка на основную публикацию