Intereting Posts
Shortcode в виджетах печатает перед заголовком Программно добавить элемент в многоязычные меню WP Переадресация поддоменов в таксономию Добавление фильтра к связанным сообщениям, не работающим Включить сообщения из категории объектов в pre_get_posts Что делают схемы login, login_post, admin и относительное значение? Время последнего обновления в виджетах Как переупорядочить страницы в массе Если сообщение относится к двум категориям, как выбрать основную категорию? WordPress slugs и 404 обрабатывают предпочтения по папкам в корне сайта? WordPress daily cron работает чаще, чем один раз в день Как я могу показать многостраничный пост как единый, завернутый пост? Поиск страницы индекса с помощью панели администратора WordPress Загрузка WordPress не появляется, и я вижу белый экран смерти в некоторых случаях Отобразить результат как «префикс + идентификатор» и показать результат поиска в виде книжного кода

Как фильтровать сообщения по таксомони, используя AJAX

Я нашел это сообщение, в котором описывается, как фильтровать сообщения категории с помощью Ajax, и он отлично работает, но я также хочу отфильтровать свои пользовательские таксономии таким же образом, и я не могу заставить его работать. Он показывает мне все сообщения, а не только сообщения из моей таксономии.

Я знаю, что меню нужно изменить на get_the_terms вместо get_the_categories но мне особенно нужна помощь в том, что нужно изменить в функции jQuery и в php-функции внизу. Я попытался добавить tax_query вызывающий мою таксономию, но он все еще не показывает правильные сообщения. Может ли кто-нибудь помочь указать мне в правильном направлении?

Solutions Collecting From Web of "Как фильтровать сообщения по таксомони, используя AJAX"

Я понял! Вот код, который я использовал:

Добавьте к 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"); //adds class current to the category menu item being displayed so you can style it with 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> 

Я не использую функцию для перечисления категорий, я просто перечисляю каждую из них отдельно. Замените номер идентификатором вашего термина:

 <ul class="nav"> <li id="term-166"><a class="yourtermname ajax" onclick="term_ajax_get('166');" href="#">Your Term Name</a></li> <li id="term-354"><a class="yourtermname ajax" onclick="term_ajax_get('354');" href="#">Your Term Name</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 arguments 'parent' => 0, //only get top level terms by default '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; } ,  public function shortcode($atts) { extract(shortcode_atts( array( 'data' => 'taxonomy', 'taxonomy' => 'category', //get_terms arguments 'parent' => 0, //only get top level terms by default '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; } ,  public function shortcode($atts) { extract(shortcode_atts( array( 'data' => 'taxonomy', 'taxonomy' => 'category', //get_terms arguments 'parent' => 0, //only get top level terms by default '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; } ,  public function shortcode($atts) { extract(shortcode_atts( array( 'data' => 'taxonomy', 'taxonomy' => 'category', //get_terms arguments 'parent' => 0, //only get top level terms by default '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', // <== this was missing 'posts_per_page' => 10, 'order' => 'DESC' );