web-dev-qa-db-fra.com

Filtrage des publications par plusieurs taxonomies

J'ai une page sur laquelle je souhaite afficher tous les messages d'un type de message personnalisé spécifique, appelons-le "personnes". Je veux permettre à l'utilisateur de filtrer toutes les personnes par plusieurs (!) Taxonomies: âge, ville, profession, niveau d'expérience. La meilleure façon de le faire consiste à cliquer sur les cases à cocher et à obtenir les résultats immédiatement via ajax sans rechargement de page.

Je pense que c'est quelque chose que beaucoup de développeurs Wordpress veulent réaliser. Malheureusement, je n'ai trouvé aucun tutoriel approprié pour y parvenir. Mais ce doit être quelque chose de facile à faire pour les développeurs WordPress expérimentés ...

Quelqu'un peut-il fournir un modèle de code expliquant comment créer une page de filtre pour le type de publication personnalisé décrit ci-dessus?

Je sais déjà comment filtrer les messages par une seule taxonomie, par jQuery. C'est le code que j'ai utilisé jusqu'à présent:

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

Ce code fonctionne parfaitement bien. Mais mon nouveau défi est de filtrer les personnes selon plus d’une taxonomie - non seulement par ville, mais aussi par âge, profession et niveau d’expérience. Comment dois-je modifier mon code pour y parvenir? Atteindre cet objectif avec l’Ajax serait bien sûr préférable.

2
Kent Miller

Tout d’abord, vous devriez utiliser WP_Query vs query_posts.

Jetez un coup d’œil aux Paramètres de taxonomie .

Principalement tax_query et 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'
            )
        )
    );

OU, si vous préférez le déclarer après, dans la boucle, regardez array_key_exists . Vous pouvez exécuter la boucle à nouveau, mais cette fois, vérifiez chaque publication pour les termes correspondants.

// 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
    } */

OU, vous pouvez simplement tout faire dans jQuery (par exemple) si vous allez déjà charger chaque message sur la page de toute façon. Vous pouvez générer des attributs data pour chaque publication contenant les termes avec lesquels ils sont marqués.

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

Et puis simplement .hide() ceux qui ne correspondent pas aux termes sélectionnés pour être filtrés.

3
deflime