Создание формы поиска по категориям товаров и ключевым словам в WooCommerce
Я хочу создать форму поиска на основе категорий и ключевых слов. У меня есть следующая форма:
<form role="search" method="get" id="searchform_special" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<div>
<label class="screen-reader-text" for="s"><?php _e( 'Поиск:', 'woocommerce' ); ?></label>
<input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" placeholder="<?php _e( 'Поиск товаров', 'woocommerce' ); ?>" />
<input type="submit" id="searchsubmit" value="<?php echo esc_attr__( 'Поиск' ); ?>" />
<input type="hidden" name="post_type" value="product" />
<input type="hidden" id="home_url" value="<?php echo esc_url( home_url( '/' ) ); ?>" />
<input type="hidden" id="categ_base_lang" value="<?php echo _x('product-category', 'slug', 'woocommerce') ?>" />
</div>
</form>
Это работает только для ключевых слов. Когда я пытаюсь добавить поиск по категориям, он не работает. Скриншот моей страницы приведен ниже.
Я хочу сделать такой тип поиска в шапке сайта. Пожалуйста, помогите мне кто-нибудь.

Я только что реализовал это для клиента, вам нужно будет сделать это через действие pre_get_posts
. Это означает, что вы добавите параметры в запрос WordPress до того, как он вернет записи.
Добавьте это в functions.php:
// расширенный функционал поиска
function advanced_search_query($query) {
if($query->is_search()) {
// поиск по терминам категории.
if (isset($_GET['category']) && !empty($_GET['category'])) {
$query->set('tax_query', array(array(
'taxonomy' => '***the_taxonomy_slug_of_your_category***',
'field' => 'slug',
'terms' => array($_GET['category']) )
));
}
}
return $query;
}
add_action('pre_get_posts', 'advanced_search_query', 1000);
Приведенный выше код работает, предполагая, что вы передали переменную category
. Вы можете сделать это, создав тег select
с именем 'category':
<select name="category">
<option value="***cat_slug***">Название категории</option>
<option value="***cat_slug***">Название категории</option>
<option value="***cat_slug***">Название категории</option>
</select>
Полная форма:
<form role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<!-- С этим скрытым полем вы можете определить конкретный тип записи. -->
<input type="hidden" name="post_type" value="your_post_type" />
<input name="s" type="text" />
<select name="category">
<!-- Вставьте сюда все нужные теги option, со значением в виде slug категории -->
</select>
<button type="submit">Отправить</button>
</form>
После отправки, $_GET[] будет содержать s
, post_type
и category
. s
и post_type
используются по умолчанию в поиске WP, а category
будет использоваться в pre_get_posts()
для добавления параметров в запрос WP.
Итак, в итоге WordPress учтет:
- s : ваши ключевые слова.
- post_type : избегает смешивания результатов, если несколько типов записей имеют одинаковую таксономию.
- category : таксономия, по которой ведется поиск.
Для WooCommerce
Замените атрибут action
вашего тега <form>
на:
<?php echo get_permalink( wc_get_page_id( 'shop' ) ); ?>
Вы также можете оставить его пустым, если уверены, что ваша форма находится только на странице магазина.
Установите значение скрытого поля на product
, slug типа записи для товаров WC.
