Как отфильтровать записи по таксономии используя AJAX
Я нашел эту публикацию, которая описывает как фильтровать записи по категориям с помощью Ajax, и это отлично работает, но я также хочу таким же образом фильтровать мои пользовательские таксономии, и у меня не получается это сделать. Отображаются все записи вместо только тех, что принадлежат моей таксономии.
Я знаю, что в меню нужно изменить get_the_terms
вместо get_the_categories
, но мне конкретно нужна помощь с тем, что изменить в функции jQuery и PHP-функции внизу. Я пробовал добавить tax_query
с указанием моей таксономии, но все равно отображаются неправильные записи. Может кто-нибудь помочь и указать верное направление?

Я разобрался! Вот код, который я использовал:
Добавьте в functions.php
:
add_action( 'wp_ajax_nopriv_load-filter2', 'prefix_load_term_posts' );
add_action( 'wp_ajax_load-filter2', 'prefix_load_term_posts' );
function prefix_load_term_posts () {
$term_id = $_POST[ 'term' ];
$args = array (
'term' => $term_id,
'posts_per_page' => -1,
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'yourtaxonomyhere',
'field' => 'id',
'terms' => $term_id,
'operator' => 'IN'
)
)
);
global $post;
$myposts = get_posts( $args );
ob_start (); ?>
<ul class="list">
<?php foreach( $myposts as $post ) : setup_postdata($post); ?>
<li><a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php echo get_post_meta($post->ID, 'image', $single = true); ?></a><br />
<?php the_title(); ?></li>
<?php endforeach; ?>
</ul>
<?php wp_reset_postdata();
$response = ob_get_contents();
ob_end_clean();
echo $response;
die(1);
}
jQuery скрипт:
<script>
function term_ajax_get(termID) {
jQuery("a.ajax").removeClass("current");
jQuery("a.ajax").addClass("current"); //добавляет класс current к текущему пункту меню категории для стилизации через css
jQuery("#loading-animation").show();
var ajaxurl = 'http://yourdomain.com/wp-admin/admin-ajax.php';
jQuery.ajax({
type: 'POST',
url: ajaxurl,
data: {"action": "load-filter2", term: termID },
success: function(response) {
jQuery("#category-post-content").html(response);
jQuery("#loading-animation").hide();
return false;
}
});
}
</script>
Я не использую функцию для вывода списка категорий, а просто перечисляю каждую отдельно. Замените число на ID вашего термина:
<ul class="nav">
<li id="term-166"><a class="yourtermname ajax" onclick="term_ajax_get('166');" href="#">Название вашего термина</a></li>
<li id="term-354"><a class="yourtermname ajax" onclick="term_ajax_get('354');" href="#">Название вашего термина</a></li>
</ul>
Также, если вы хотите фильтровать метки вместо терминов, замените:
'term'
на'tag__in'
,$term_id
на$tag_id
- и измените
'taxonomy' => 'yourtaxonomyhere'
на'taxonomy' => 'post_tag'
.

Предлагаю использовать шорткод для отображения таксономии по вашему выбору: создайте класс для объявления шорткода и вызовите эту функцию
public function shortcode($atts)
{
extract(shortcode_atts( array(
'data' => 'taxonomy',
'taxonomy' => 'category',
//аргументы get_terms
'parent' => 0, //по умолчанию получаем только термины верхнего уровня
'exclude'=>'',
'type'=>'radio' // checkbox,radio
), $atts,'astSearchInput' ));
$arrStr =array();
$arrStr[]= "<div class='astSearchInput " . $taxonomy. "' taxonomy='" .$taxonomy. "'>" ;
if ($type=="checkbox" || $type=="radio")
{
if ($data=="taxonomy")
{
//echo $datatata;
$arrValues=get_terms($taxonomy, array("parent"=>$parent, "exclude"=>$exclude));
}
if ($type=="checkbox")$arrStr[]= $this->inputCheckBox($arrValues,$atts);
if ($type=="radio")$arrStr[]= $this->inputRadio($arrValues,$atts);
}
$arrStr[]= "</div>";
$str=join("\n",$arrStr);
return $str ;
}
function inputCheckBox($arrValues,$attr)
{
$arrStr =array();
$arrStr[]='<div class="formcb">';
foreach($arrValues as $k=>$term)
{
$title=$term->name; //$term->description
// print_r($term);
$id="cb" . $term->term_id;
$arrStr[]='<div class="cb"><input class="astInpuntTerm astcheckBox" type="checkbox" id="' . $id .'" value="' . $term->term_id . '" ><label for="' . $id . '">' . $title. '</label></div>';
}
$arrStr[]='</div>';
$str=join("\n",$arrStr);
return $str;
}
http://www.webmasterbulletin.net/wordpress-ajax-taxonomy-search-shortcode

У меня была похожая проблема.
Код хороший, но требует небольшой модификации для работы.
$args = array (
'term' => $term_id,
'posts_per_page' => -1,
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'yourtaxonomyhere', // ваша таксономия здесь
'field' => 'id',
'terms' => $term_id,
'operator' => 'IN'
)
),
'post_type' => 'yourcustomposttype', // ваш пользовательский тип записи <== этого не хватало
'posts_per_page' => 10,
'order' => 'DESC'
);
