Фильтрация записей по нескольким таксономиям в WordPress
У меня есть страница, на которой я хочу отображать все записи определенного пользовательского типа записей, назовем его "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.

Прежде всего, вам следует использовать 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()
те, которые не соответствуют выбранным терминам для фильтрации.

Это не новый вопрос, однако сегодня нам не обязательно использовать jQuery и WP_Query
, чтобы заставить подобные вещи работать.
Более того, в блочных темах WordPress мы даже не можем использовать WP_Query
для создания фильтра по таксономиям.
На мой взгляд, нам следует использовать следующее:
- Блок Query Loop (доступен как часть редактора сайта WordPress)
- Interactivity API (который позволяет сделать наш фильтр полностью AJAX)
- Блок фильтра таксономий (который будет взаимодействовать как с Interactivity API, так и с блоком Query Loop, фильтруя записи или пользовательские типы записей для нас).
Поскольку первые два компонента доступны в WordPress по умолчанию, нам остаётся только добавить блок фильтра таксономий, чтобы всё заработало. Я рекомендую взглянуть на этот вариант: https://rudrastyh.com/plugins/taxonomy-filter-block.
