web-dev-qa-db-ja.com

複数の分類法による投稿のフィルタリング

特定のカスタム投稿タイプのすべての投稿を表示するページがあります。それを「人物」と呼びましょう。ユーザーに、年齢、市、職業、経験レベルなど、複数の(!)分類法ですべての人をフィルターにかけさせることを許可します。これを行う最良の方法は、チェックボックスをクリックして、ページをリロードすることなくajaxを介して結果をすぐに取得することです。

これは多くのWordpress開発者が実現したいと思うものだと私は思います。残念ながら、これを実現するための適切なチュートリアルは見つかりませんでした。しかし、それは熟練したWordPress開発者にとっては簡単なことでなければなりません...

上記のカスタム投稿タイプのフィルタページを作成する方法のコードテンプレートを誰かが提供できますか?

私はすでにjQueryによって1つの分類法によって投稿をフィルタリングする方法を知っています。これは私がこれまでに使ったコードです:

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

このコードは完璧に動作します。しかし、私の新たな課題は、都市だけでなく、年齢、職業、経験のレベルによっても、人を複数の分類法で絞り込むことです。これを達成するためにどのように私は私のコードを修正する必要がありますか? Ajaxでこれを達成することは、もちろん好ましい方法でしょう。

2
Kent Miller

まず、 WP_Query vs query_postsを使用します。

分類パラメータ を見てください。

主にtax_queryrelation

// 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'
            )
        )
    );

または、ループ内で array_key_exists を見てから宣言したい場合は、もう一度ループを実行することもできますが、今回は各記事で一致する用語を確認します。

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

あるいは、ページ上のすべての投稿をロードする予定であれば、(たとえば)jQueryですべてを実行することもできます。タグ付けされた用語を含む投稿ごとにdata属性を出力できます。

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

そして、選択した条件に一致しないものを単にフィルタリングするために.hide()します。

3
deflime