Фильтр-поиск по атрибутам товаров и мета-полям в WooCommerce

В WooCommerce можно сделать фильтр поиск по атрибутам и мета-полям товаров, как на рисунке:

поиск woocommerce

Начнем с html формы поиска:

<form role="search" method="get" class="woocommerce-product-search"
      action="<?php echo esc_url(home_url('/')); ?>">
    <input style="display: none;" type="search"
           id="woocommerce-product-search-field-<?php echo isset($index) ? absint($index) : 0; ?>"
           class="search-field"
           placeholder="<?php echo esc_attr__('Search products&hellip;', 'woocommerce'); ?>" value=""
           name="s"/>
    <div class="s-fast-search__h">
        Быстрый поиск
    </div>
    <div class="row s-fast-search__row justify-content-center">

        <div class="col-lg-3 col-md-6">
            <?php
            $city = wp_dropdown_categories("taxonomy=pa_gorod&echo=0&show_option_none=Все города&name=gorod");
            ?>

            <label>Выберите город</label>
            <?= $city; ?>


        </div>

        <div class="col-lg-3 col-md-6">
            <?php
            $transport = wp_dropdown_categories("taxonomy=pa_peredvizhenie&echo=0&show_option_none=Все&name=peredvizhenie");
            ?>

            <label>Передвижение</label>
            <?= $transport; ?>

        </div>

        <div class="col-lg-3 col-md-6">
            <?php
            $vid_puteshestvija = wp_dropdown_categories("taxonomy=pa_vid-puteshestvija&echo=0&show_option_none=Все виды&name=vid-puteshestvija");
            ?>

            <label>Вид путешествия</label>
            <?= $vid_puteshestvija; ?>

        </div>

        <div class="col-lg-3 col-md-6">
            <label>Дата</label>

            <input type="text" name="put-date" class="s-fast-search__date">

        </div>

    </div>
    <!--row-->

    <button type="submit" class="s-fast-search__btn  b-btn-bg-mc2"
            value="<?php echo esc_attr_x('Search', 'submit button', 'woocommerce'); ?>">Искать
    </button>
    <input type="hidden" name="post_type" value="product"/>

</form>

 

Затем нужно отфильтровать товары, согласно данным, полученным из этой формы. Воспользуемся хуком pre_get_post, и если осуществляется поиск, изменим запрос wp_query:

add_action('pre_get_posts', 'search_by_cat');
function  search_by_cat() {
    global $wp_query;

    if (is_search()) {

        $gorod =  intval($_GET['gorod']);
        if($gorod>0){
            $wp_query->query_vars['tax_query'][] = array( //для атрибутов товаров
                "taxonomy" => "pa_gorod",
                "field" => "id",
                "terms" =>  $gorod
            );
        }

        $tip =  intval($_GET['peredvizhenie']);
        if($tip>0){
            $wp_query->query_vars['tax_query'][] = array(
                "taxonomy" => "pa_peredvizhenie",
                "field" => "id",
                "terms" =>  $tip
            );
        }

        $vid =  intval($_GET['vid-puteshestvija']);
        if($vid>0){
            $wp_query->query_vars['tax_query'][] = array(
                "taxonomy" => "pa_vid-puteshestvija",
                "field" => "id",
                "terms" =>  $vid
            );
        }

        $date = $_GET['put-date'];
        if($date){
            $wp_query->query_vars['meta_key'] = 'nearest_date'; // для мета-полей товаров
            $wp_query->query_vars['meta_value']  = strtotime($date);
        }

    }
}

Обновлено: 10.11.2018

Вам помогла эта статья? Оцените!
(5 оценок, среднее: 3,40 из 5)
Загрузка...

Комментариев: 2

  • Хороший гайд, но было бы не плохо побольше комментов в коде, чтобы новички могли понимать что и от чего зависит) А то просто вы выкинули исходник и все, адаптируйте дальше как хотите 😀

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *