web-dev-qa-db-ja.com

同じ分類用語で投稿を表示する

ループ内に5つの関連する投稿を表示しようとしています。それらの関連する投稿は、同じ分類値を共有する投稿です。例えば私はvenuesと呼ばれるカスタム分類法を設定しているので、それぞれのポストにはvenue分類法の値が割り当てられているので、同じ分類法の値を共有する他の5つのポストを表示します。
これまでに手に入れたコードは、まったくうまくいきません。

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php
$custom_terms = get_terms('venues');

foreach($custom_terms as $custom_term) {
    wp_reset_query();
    $args = array('post_type' => 'listings',
    'posts_per_page' => 5,
        'tax_query' => array(
            array(
                'taxonomy' => 'venues',
                'field' => 'slug',
                'terms' => $custom_term->slug,
            ),
        ),
     );

     $loop = new WP_Query($args);
     if($loop->have_posts()) {

        while($loop->have_posts()) : $loop->the_post(); ?>
        <div class="listing-title"><?php the_title(); ?></div>     
        <?php endwhile;
     }
}
?>
<?php wp_reset_query(); ?>
<?php endwhile; endif; ?>

5つの投稿が正常に表示されていますが、それらは同じ投稿タイプの5つの投稿であり、ループ内で同じ分類値を共有する5つの投稿ではありません。任意の提案は大歓迎です!

3
user1374796

全くテストされていませんし、私があなたの質問を理解していると100%確信することはできませんが、これは(理論的に)現在の投稿と同じ会場を共有する5つの投稿を取得するはずです。私はおそらくあなたが絶えずクエリを実行していないようにこれにいくつかのトランジェントを追加することをお勧めします。

うまくいかない場合は、税務照会の構文が少しずれていると思います。それは配列の配列だからそれはいつも私をつかまえる。

//get the post's venues
$custom_terms = get_terms('venues');

if( $custom_terms ){

    // going to hold our tax_query params
    $tax_query = array();

    // add the relation parameter (not sure if it causes trouble if only 1 term so what the heck)
    if( count( $custom_terms > 1 ) )
        $tax_query['relation'] = 'OR' ;

    // loop through venus and build a tax query
    foreach( $custom_terms as $custom_term ) {

        $tax_query[] = array(
            'taxonomy' => 'venues',
            'field' => 'slug',
            'terms' => $custom_term->slug,
        );

    }

    // put all the WP_Query args together
    $args = array( 'post_type' => 'listings',
                    'posts_per_page' => 5,
                    'tax_query' = $tax_query );

    // finally run the query
    $loop = new WP_Query($args);

    if( $loop->have_posts() ) {

        while( $loop->have_posts() ) : $loop->the_post(); ?>

        <div class="listing-title"><?php the_title(); ?></div>     
        <?php 

        endwhile;

    }

    wp_reset_query();?>

}
2
helgatheviking

良い解決策をありがとう、しかしその1つはあなたに同じ分類学のどんな用語でもあなたをポストさせるでしょう。しかし、あなたが現在の記事と同じ用語を持っているものだけが欲しいなら、あなたはこのようなコードを修正する必要があります。これはテスト済みで動作するはずです。

 <?php
        //get the post's venues
    $custom_terms = wp_get_post_terms($post->ID, 'venues');

    if( $custom_terms ){

        // going to hold our tax_query params
        $tax_query = array();

        // add the relation parameter (not sure if it causes trouble if only 1 term so what the heck)
        if( count( $custom_terms > 1 ) )
            $tax_query['relation'] = 'OR' ;

        // loop through venus and build a tax query
        foreach( $custom_terms as $custom_term ) {

            $tax_query[] = array(
                'taxonomy' => 'venues',
                'field' => 'slug',
                'terms' => $custom_term->slug,
            );

        }

        // put all the WP_Query args together
        $args = array( 'post_type' => 'listings',
                        'posts_per_page' => 5,
                        'tax_query' => $tax_query );

        // finally run the query
        $loop = new WP_Query($args);

        if( $loop->have_posts() ) {

            while( $loop->have_posts() ) : $loop->the_post(); ?>

            <div class="listing-title"><?php the_title(); ?></div>     
            <?php 

            endwhile;

        }

        wp_reset_query();

    }?>
0
Juha