it-swarm.com.de

Wie filtere ich Posts nach Taxonomie mit AJAX

Ich habe diesen Beitrag gefunden, der beschreibt, wie man Kategorie-Beiträge mit Ajax filtert, und er funktioniert hervorragend, aber ich möchte auch meine benutzerdefinierten Taxonomien auf die gleiche Weise filtern, und ich kann ihn nicht zum Laufen bringen. Es zeigt mir alle Posts anstatt nur die Posts aus meiner Taxonomie.

Ich weiß, dass das Menü in get_the_terms anstelle von get_the_categories geändert werden muss, aber ich benötige speziell Hilfe bei der Änderung der jQuery-Funktion und der PHP-Funktion unten. Ich habe versucht, einen tax_query hinzuzufügen, der meine Taxonomie aufruft, aber es werden immer noch nicht die richtigen Beiträge angezeigt. Kann mir jemand helfen, in die richtige Richtung zu weisen?

3
Emily

Ich habe es herausgefunden! Hier ist der Code, den ich verwendet habe:

Zu functions.php hinzufügen:

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-Skript:

<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>

Ich benutze keine Funktion, um die Kategorien aufzulisten, sondern liste sie nur einzeln auf. Ersetzen Sie die Nummer durch die ID Ihres Begriffs:

<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>

Wenn Sie Tags anstelle von Begriffen filtern möchten, ersetzen Sie außerdem Folgendes:

  • 'term' mit 'tag__in',
  • $term_id mit $tag_id
  • und 'taxonomy' => 'yourtaxonomyhere' in 'taxonomy' => 'post_tag' ändern.
8
Emily

Ich schlage vor, dass Sie einen Shortcode verwenden, um die Taxonomie Ihrer Wahl anzuzeigen: Erstellen Sie eine Klasse, um den Shortcode zu deklarieren, und rufen Sie diese Funktion auf

  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

0
erwanpia

Ich hatte ein ähnliches Problem.

Der Code ist gut, muss jedoch geringfügig geändert werden, um zu funktionieren.

            $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'
         );
0
Camil