Создание формы поиска по категориям товаров и ключевым словам в WooCommerce

14 апр. 2015 г., 13:45:38
Просмотры: 24.3K
Голосов: 3

Я хочу создать форму поиска на основе категорий и ключевых слов. У меня есть следующая форма:

<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>

Это работает только для ключевых слов. Когда я пытаюсь добавить поиск по категориям, он не работает. Скриншот моей страницы приведен ниже.

Мой скриншот

Я хочу сделать такой тип поиска в шапке сайта. Пожалуйста, помогите мне кто-нибудь.

0
Все ответы на вопрос 1
2

Я только что реализовал это для клиента, вам нужно будет сделать это через действие 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.

14 апр. 2015 г. 17:54:27
Комментарии

Я хочу также искать товары по ключевым словам...

Padmanathan J Padmanathan J
15 апр. 2015 г. 07:14:20

Конечно. Я отредактирую свой пост, чтобы вы увидели всю форму целиком!

Sebastien Sebastien
15 апр. 2015 г. 10:28:03