Фильтрация записей по нескольким таксономиям в WordPress

15 июл. 2014 г., 22:49:45
Просмотры: 14.8K
Голосов: 2

У меня есть страница, на которой я хочу отображать все записи определенного пользовательского типа записей, назовем его "persons". Я хочу позволить пользователю фильтровать всех людей по нескольким (!) таксономиям: возраст, город, профессия, уровень опыта. Лучший способ сделать это - с помощью чекбоксов и получения результатов сразу через AJAX без перезагрузки страницы.

Думаю, это то, что многие разработчики WordPress хотят реализовать. К сожалению, я не нашел подходящего руководства по достижению этого. Но для опытных разработчиков WordPress это должно быть что-то простое...

Может ли кто-нибудь предоставить шаблон кода для создания страницы фильтрации для описанного выше пользовательского типа записей?

Я уже знаю, как фильтровать записи по ОДНОЙ таксономии с помощью jQuery. Вот код, который я использовал до сих пор:

<!-- ШАБЛОН СТРАНИЦЫ ДЛЯ ОБЗОРА ВСЕХ ЗАПИСЕЙ ПОЛЬЗОВАТЕЛЬСКОГО ТИПА "PERSONS" -->

        <!-- СПИСОК ВСЕХ ЭЛЕМЕНТОВ ТАКСОНОМИИ "CITIES"  -->
        <div class="cities">

        <a href="#" id="all">Все города</a>             
        <?php
        // Получаем все термины таксономии
        $taxonomy = 'cities';
        $terms = get_terms($taxonomy); 
        if ( $terms && !is_wp_error( $terms ) ) :
        foreach ( $terms as $term ) { ?>
            <a href="javascript:void(0);" data-target="<?php echo $term -> slug; ?>"><?php echo $term -> name; ?></a>
         <?php } endif; ?>

        </div>

        <!-- ВЫВОД ЛЮДЕЙ -->

        <div class="overview_persons">

            <?php  
            $args= array(
                'post_type' => 'persons', 
                'post_status' => 'publish',
                'meta_key' => 'zip',
                'orderby' => 'meta_value_num',
                'order' => 'ASC',
                'posts_per_page' => -1
            );
            query_posts($args);

            if ( have_posts() ) : while ( have_posts() ) : the_post(); 

                $post_terms = wp_get_post_terms( $post->ID, $taxonomy, array( "fields" => "slugs" ) );
                $post_terms_space_separated = implode(" ", $post_terms);
                ?>

                <!-- выводим выбранное значение таксономии в классе div person -->
                <div class="person <?php echo $post_terms_space_separated; ?>">
                    <!-- описание человека -->                          
                </div>                  

            <?php endwhile; endif; wp_reset_query(); ?>

        </div>

<!-- МОЙ JQUERY ДЛЯ ФИЛЬТРАЦИИ ЛЮДЕЙ ПО ТАКСОНОМИИ "CITY" -->
<script>
    jQuery(document).ready(function() {

        // Клик по городу 
        jQuery('a[data-target]').click(function() {
              jQuery('.person').show().not('.' + this.dataset.target).hide();

        });

        // Клик по "Все города"
        jQuery('#all').click(function(e) {
              e.preventDefault();
              jQuery('.person').show();

        });

    });

</script>

Этот код работает отлично. Но моя новая задача - фильтровать людей по более чем одной таксономии - не только по городу, но и по возрасту, профессии и уровню опыта. Как мне нужно изменить свой код для достижения этого? Конечно, предпочтительнее было бы реализовать это через Ajax.

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

Прежде всего, вам следует использовать WP_Query вместо query_posts.

Ознакомьтесь с Параметрами таксономий.

В основном это tax_query и relation.

// Перепост из ссылки выше
   $args = array(
        'post_type' => 'post',
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'movie_genre',
                'field' => 'slug',
                'terms' => array( 'action', 'comedy' )
            ),
            array(
                'taxonomy' => 'actor',
                'field' => 'id',
                'terms' => array( 103, 115, 206 ),
                'operator' => 'NOT IN'
            )
        )
    );

ИЛИ, если вы предпочитаете объявить это позже, внутри цикла, посмотрите на array_key_exists. Вы можете запустить цикл снова, но на этот раз проверять каждый пост на соответствие терминам.

// БОЛЬШЕ НЕ РАБОТАЕТ, WORDPRESS ИЗМЕНИЛ СТРУКТУРУ МАССИВА get_the_terms() -- ОКТЯБРЬ 2015
   /* if( array_key_exists( 111, get_the_terms($post->ID,'age') ) &&  array_key_exists( 222, get_the_terms($post->ID,'city') ) ) { 
      // вывести пост
    } */

ИЛИ, вы можете сделать всё на jQuery (например), если вы уже собираетесь загружать все посты на страницу в любом случае. Вы можете вывести атрибуты data для каждого поста, содержащие термины, с которыми они связаны.

<!-- Например // Где 111 и 222 относятся к id термина -->
<div class="person" data-age="id111" data-city="id222"></div>

И затем просто .hide() те, которые не соответствуют выбранным терминам для фильтрации.

15 июл. 2014 г. 23:36:01
0

Это не новый вопрос, однако сегодня нам не обязательно использовать jQuery и WP_Query, чтобы заставить подобные вещи работать.

Более того, в блочных темах WordPress мы даже не можем использовать WP_Query для создания фильтра по таксономиям.

На мой взгляд, нам следует использовать следующее:

  • Блок Query Loop (доступен как часть редактора сайта WordPress)
  • Interactivity API (который позволяет сделать наш фильтр полностью AJAX)
  • Блок фильтра таксономий (который будет взаимодействовать как с Interactivity API, так и с блоком Query Loop, фильтруя записи или пользовательские типы записей для нас).

Поскольку первые два компонента доступны в WordPress по умолчанию, нам остаётся только добавить блок фильтра таксономий, чтобы всё заработало. Я рекомендую взглянуть на этот вариант: https://rudrastyh.com/plugins/taxonomy-filter-block.

2 янв. 2025 г. 07:59:53