it-swarm.com.de

Beiträge nach mehreren Taxonomien filtern

Ich habe eine Seite, auf der ich alle Beiträge eines bestimmten benutzerdefinierten Beitragstyps anzeigen möchte. Nennen wir sie "Personen". Ich möchte dem Benutzer erlauben, alle Personen nach mehreren (!) Taxonomien zu filtern: Alter, Stadt, Beruf, Erfahrungsstufe. Der beste Weg, dies zu tun, wäre durch Anklicken von Kontrollkästchen und sofortiges Abrufen der Ergebnisse über Ajax, ohne dass eine Seite neu geladen werden muss.

Ich denke, das ist etwas, was viele Wordpress-Entwickler realisieren wollen. Leider habe ich kein geeignetes Tutorial gefunden, um dies zu erreichen. Aber für erfahrene WordPress-Entwickler muss es einfach sein ...

Kann jemand eine Codevorlage zum Erstellen einer Filterseite für den oben beschriebenen benutzerdefinierten Beitragstyp bereitstellen?

Ich weiß bereits, wie man Beiträge nach nur EINER Taxonomie filtert, nach jQuery. Dies ist der Code, den ich bisher verwendet habe:

<!-- PAGE TEMPLATE FOR OVERVIEW OF ALL POSTS OF CUSTOM POST TYPE "PERSONS" -->

        <!-- LIST OF ALL ENTRIES OF TAXONOMY "CITIES"  -->
        <div class="cities">

        <a href="#" id="all">All cities</a>             
        <?php
        // Get all terms of a taxonomy
        $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>

        <!-- OUTPUT PERSONS -->

        <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);
                ?>

                <!-- output selected taxonomy value in class of person div -->
                <div class="person <?php echo $post_terms_space_separated; ?>">
                    <!-- description of person -->                          
                </div>                  

            <?php endwhile; endif; wp_reset_query(); ?>

        </div>

<!-- MY JQUERY FOR FILTERING PERSONS VIA TAXONOMY "CITY" -->
<script>
    jQuery(document).ready(function() {

        // Click on a city 
        jQuery('a[data-target]').click(function() {
              jQuery('.person').show().not('.' + this.dataset.target).hide();

        });

        // Click on "All cities"
        jQuery('#all').click(function(e) {
              e.preventDefault();
              jQuery('.person').show();

        });

    });

</script>

Dieser Code funktioniert einwandfrei. Aber meine neue Herausforderung besteht darin, Personen nach mehr als einer Taxonomie zu filtern - nicht nur nach Stadt, sondern auch nach Alter, Beruf und Erfahrungsniveau. Wie muss ich meinen Code ändern, um dies zu erreichen? Dies durch Ajax zu erreichen, wäre natürlich der bevorzugte Weg.

2
Kent Miller

Zunächst sollten Sie WP_Query vs query_posts verwenden.

Werfen Sie einen Blick auf die Taxonomieparameter .

Hauptsächlich tax_query und relation.

// Repost from link above
   $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'
            )
        )
    );

ODER, wenn Sie es lieber deklarieren möchten, schauen Sie sich in der Schleife array_key_exists an. Sie können die Schleife erneut ausführen, aber diesmal überprüfen Sie jeden Beitrag auf übereinstimmende Begriffe.

// NO LONGER WORKS, WORDPRESS HAS CHANGED THE ARRAY STRUCTURE OF get_the_terms() -- OCT 2015
   /* if( array_key_exists( 111, get_the_terms($post->ID,'age') ) &&  array_key_exists( 222, get_the_terms($post->ID,'city') ) ) { 
      // output the post
    } */

ODER Sie könnten einfach alles in jQuery erledigen (zum Beispiel), wenn Sie bereits jeden einzelnen Beitrag auf der Seite laden möchten. Sie können data Attribute für jeden Beitrag ausgeben, der die Begriffe enthält, mit denen sie markiert sind.

<!-- For example // Where 111 and 222 refers to the term id -->
<div class="person" data-age="id111" data-city="id222"></div>

Und dann einfach .hide() diejenigen, die nicht den ausgewählten zu filternden Begriffen entsprechen.

3
deflime