@thedexploit
Сайтами маюсь

Как сделать изменения ссылки страницы при фильтрации записей?

Доброго времени. Возникла задачка.

На сайте установлен плагин "Advansed custom fields", через него реализован раздел "Недвижимость" и собственно все вытекающие поля (количество комнат, стоимость, площадь, район и т.д.)

На страницах каталога реализован фильтр записей. Он работает как нужно, автоматически подтягивает все объекты. Вопросов нет тут. Вопрос есть к ссылкам. Ссылка на страницу не меняется, а хотелось бы, чтобы при применении сортировки изменялась ссылка и её можно отправить там клиенту или менеджеру.

Есть плагин "Search & Filter Pro" очень похоже но, из-за особенности "смекалки" тех кто делал сайт, плагин сработает не так как надо. Уже тестил.

Сам код фильтра выглядит таким образом.

PHP functions.php
function true_filter_function(){
    //echo $_POST['country'];
    $args = array(
        'post_type' => 'hotel',
        'meta_key' => 'price',
        'orderby' => 'meta_value', // сортировка по дате у нас будет в любом случае (но вы можете изменить/доработать это)
        'order'	=> 'ASC',
        'tax_query' => array(
            array(
                'taxonomy' => 'country',
                'field' => 'slug',
                'terms' => $_POST['country']
            )
        ),
        $args['meta_query'] = array( 'relation'=>'AND' )
    );

    $more_than_one = false;



//    // создаём массив $args['meta_query'] если указана хотя бы одна цена или отмечен чекбокс
//    if( isset( $_POST['cena_min'] ) || isset( $_POST['cena_max'] ) || ( isset( $_POST['featured_image'] ) && $_POST['featured_image'] == 'on' ) )
//        $args['meta_query'] = array( 'relation'=>'AND' ); // AND значит все условия meta_query должны выполняться
//
    // условие 1: цена больше $_POST['cena_min']
    if($_POST['bed_quantity'] != 'none') {
        $compare = '=';
        if ($_POST['bed_quantity'] == '5') {
            $compare = '>=';
        }
        $args['meta_query'][] = array(
            'key' => 'kol-vo_spalen',
            'compare' => $compare,
            'value' => $_POST['bed_quantity'],
            'type' => 'numeric',
        );
    }
    if($_POST['object_type'] != 'none') {
        $args['meta_query'][] = array(
            'key' => 'object-type-filter',
            'compare' => '=',
            'value' => $_POST['object_type'],
            'type' => 'CHAR',
        );
    }
    if($_POST['region'] != 'none') {
        $args['meta_query'][] = array(
            'key' => 'hotel-region',
            'compare' => '=',
            'value' => $_POST['region'],
            'type' => 'CHAR',
        );
    }
    if($_POST['sea_distance'] != 'none') {
        $compare = '<=';
        if ($_POST['sea_distance'] == '6000') {
            $compare = '>=';
        }
        $args['meta_query'][] = array(
            'key' => 'sea-distance',
            'compare' => $compare,
            'value' => (int)$_POST['sea_distance'],
            'type' => 'numeric',
        );
    }
    if($_POST['bassein'] != 'none') {
        $args['meta_query'][] = array(
            'key' => 'bassein',
            'compare' => '=',
            'value' => (int)$_POST['bassein'],
            'type' => 'numeric',
        );
    }
    if($_POST['price'] != 'none') {
        $price = explode('-',$_POST['price']);
        $min_price = $price[0];
        $max_price = $price[1];

        if ($max_price === '+') {
            $args['meta_query'][] = array(
                'key' => 'price',
                'compare' => '>=',
                'value' => (int)$min_price,
                'type' => 'numeric',
            );
        }
        else {
            $args['meta_query'][] = array(
                'key' => 'price',
                'compare' => '>=',
                'value' => (int)$min_price,
                'type' => 'numeric',
            );
            $args['meta_query'][] = array(
                'key' => 'price',
                'compare' => '<=',
                'value' => (int)$max_price,
                'type' => 'numeric',
            );
        }

    }

    $query = new WP_Query($args);
    $action_from_count = get_field('action-form-number', 'option');
    $count = 1;
    if ($query->have_posts()) :
        while ($query->have_posts()) : $query->the_post(); ?>
            <div class="col-lg-4" style="position: relative">
                <div class="single-destinations-list style-four">
                    <a href="<?php the_permalink(); ?>" class="wrapper-link"> </a>
                    <div class="blur-thumb" style="background-image:url(<?php echo get_the_post_thumbnail_url(); ?>);"></div>
                    <div class="details dark">

                        <p class="location"><img src="<?php echo get_template_directory_uri(); ?>/assets\img\icons\1.png" alt="map"><?php the_field('hotel-region'); ?></p>
                        <h4 class="title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
                        <p class="content"><?php echo get_the_excerpt(); ?></p>
                        <div class="list-price-meta">
                            <ul class="tp-list-meta d-inline-block">
                                <!--                                    <li><i class="fa fa-calendar-o"></i> 8oct</li>-->
                                <li><i class="fa fa-university"></i> <?php the_field('square'); ?>m2</li>
                                <li><i class="fa fa-bed"></i> <?php the_field('kol-vo_spalen'); ?></li>
                                  <!--      <?php if ( get_field('bassein')) { ?>
                                    <li><i class="fa fa-bath"></i></li>
                                <?php } ?>-->
                            </ul>
                            <div class="tp-price-meta d-inline-block">
                                <p>Цена</p>
                                <h2><?php the_field('price'); ?><span> €</span></h2>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <?php
            //echo $count%$action_from_count;
            if ($count%$action_from_count === 0) {
                $count = 0; ?>
                <div class="col-12 d-block d-md-none">
                    <!-- newslatter area Start -->
                    <div class="newslatter-area pd-top-30">
                        <div class="container">
                            <div class="newslatter-area-wrap border-tp-solid">
                                <div class="row">
                                    <div class=" col-md-5 offset-md-1 offset-0">
                                        <div class="section-title mb-md-0">
                                            <h3 class="title">Получить каталог</h3>
                                            <p>Подберем для Вас наилучшие варианты</p>
                                        </div>
                                    </div>

                                    <div class="col-md-5 align-self-center action-form">
                                        <?php
                                        $catalog_form = get_field('country-shortcode', 'option');
                                        echo do_shortcode("$catalog_form");
                                        ?>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <!-- newslatter area End -->
                </div>
            <?php }

            $count++;
        endwhile;
    endif;
    if (  $query->max_num_pages > 1 ) : ?>
        <script>
            var ajaxurl = '<?php echo site_url() ?>/wp-admin/admin-ajax.php';
            var true_posts = '<?php echo serialize($query->query_vars); ?>';
            var current_page = <?php echo (get_query_var('paged')) ? get_query_var('paged') : 1; ?>;
            var max_pages = '<?php echo $query->max_num_pages; ?>';

            jQuery(function($){
                $('#true_loadmore').click(function(){
                    $(this).text('Загружаю...'); // изменяем текст кнопки, вы также можете добавить прелоадер
                    var data = {
                        'action': 'loadmore',
                        'query': true_posts,
                        'page' : current_page
                    };
                    $.ajax({
                        url:ajaxurl, // обработчик
                        data:data, // данные
                        type:'POST', // тип запроса
                        success:function(data){
                            if( data ) {
                                $('#true_loadmore').text('Загрузить ещё'); // вставляем новые посты
                                $('#true_loadmore_wrapper').before(data); // вставляем новые посты
                                current_page++; // увеличиваем номер страницы на единицу
                                if (current_page == max_pages) $("#true_loadmore").remove(); // если последняя страница, удаляем кнопку
                            } else {
                                $('#true_loadmore').remove(); // если мы дошли до последней страницы постов, скроем кнопку
                            }
                        }
                    });
                });
            });
        </script>
        <div class="col-12 text-center" id="true_loadmore_wrapper">
            <div id="true_loadmore">Загрузить ещё</div>
        </div>

    <?php endif;
    die();
}


add_action('wp_ajax_myfilter', 'true_filter_function');
add_action('wp_ajax_nopriv_myfilter', 'true_filter_function');
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы