Cum să filtrez articolele după taxonomie folosind AJAX
Am găsit acest articol care descrie cum să filtrez articolele după categorie folosind Ajax și funcționează excelent, dar vreau să filtrez și taxonomiile mele personalizate în același mod și nu reușesc să îl fac să funcționeze. Îmi arată toate articolele în loc să le arate doar pe cele din taxonomia mea.
Știu că meniul trebuie modificat pentru a folosi get_the_terms
în loc de get_the_categories
, dar am nevoie în mod specific de ajutor cu ce trebuie schimbat în funcția jQuery și în funcția PHP de la final. Am încercat să adaug un tax_query
care apelează taxonomia mea, dar tot nu afișează articolele corecte. Poate cineva să mă îndrume în direcția corectă?

Am reușit să rezolv! Iată codul pe care l-am folosit:
Adăugați în 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);
}
Script jQuery:
<script>
function term_ajax_get(termID) {
jQuery("a.ajax").removeClass("current");
jQuery("a.ajax").addClass("current"); //adaugă clasa current la elementul de meniu afișat pentru a-l stiliza cu 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>
Nu folosesc o funcție pentru a lista categoriile, ci le listez separat pe fiecare. Înlocuiți numărul cu ID-ul termenului vostru:
<ul class="nav">
<li id="term-166"><a class="yourtermname ajax" onclick="term_ajax_get('166');" href="#">Numele Termenului Tău</a></li>
<li id="term-354"><a class="yourtermname ajax" onclick="term_ajax_get('354');" href="#">Numele Termenului Tău</a></li>
</ul>
De asemenea, dacă doriți să filtrați etichetele în loc de termeni, înlocuiți:
'term'
cu'tag__in'
,$term_id
cu$tag_id
- și schimbați
'taxonomy' => 'yourtaxonomyhere'
în'taxonomy' => 'post_tag'
.

Vă sugerez să utilizați un shortcode pentru a afișa taxonomia la alegere: creați o clasă pentru a declara shortcode-ul și apelați această funcție
public function shortcode($atts)
{
extract(shortcode_atts( array(
'data' => 'taxonomy',
'taxonomy' => 'category',
//argumentele get_terms
'parent' => 0, //implicit preia doar termenii de nivel superior
'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

Am avut o problemă similară.
Codul este bun, dar are nevoie de mici modificări pentru a funcționa.
$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', // <== lipsea acest parametru
'posts_per_page' => 10,
'order' => 'DESC'
);
