サポート » 使い方全般 » カスタムタクソノミーの関連記事表示で同じ投稿が重複して出てきます。

  • 解決済 ddid

    (@ddid)


    関連記事の表示にて、複数のタームをセットした記事を呼び出したいのですが、
    下記の方法ですと、同じ投稿が重複して出てしまうようです。

    <?php
      $terms = get_the_terms($post->ID, 'カスタムタクソノミー名');
      foreach ( $terms as $term ):
        $args = array(
          'posts_per_page'   => -1,
          'orderby'          => 'post_date',
          'order'            => 'DESC',
          'post_type'        => 'カスタム投稿名',
          'exclude'          => array( 1340,1341 ),
          'post_status'      => 'publish',
          'post__not_in'     => array($post->ID),
          'tax_query' => array( 
            array(
              'taxonomy' => 'カスタムタクソノミー名', 
              'field' => 'id', 
              'terms' => array( $term->term_id ),
              'operator'=>'IN'
            ),
            'relation' => 'AND'
          ),
          'suppress_filters' => true );
          $my_query = new WP_Query( $args );
          while ( $my_query->have_posts() ): 
          $my_query->the_post(); 
    ?>
    
    /* 表示内容 */
    
          <?php endwhile; 
        wp_reset_postdata(); 
      endforeach;
    ?>

    という形で表記しております。

    投稿の中には、
    「タームA」「タームB」両方に含まれるものもあり
    その場合、上記の内容で投稿をすると、関連記事の中に2回表示されることとなります。

    こちらを1回だけにしたいのですが、
    良い方法はございますでしょうか。
    ご教示いただければ幸いです。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • CG

    (@du-bist-der-lenz)

    条件分岐では、処理に時間がかかりますか

    ご回答ありがとうございます。
    条件分岐で表示させる方法とのことですが、

    処理の時間というよりも、
    どういった形で分岐させればよいか
    スキル不足のためわかりません。。。

    まず、 WP_Query の使い方について、いくつか。
    exclude ですが、これは get_posts() でのみ使えるもので、 WP_Query では post__not_in を使います。
    また tax_query における relation は配列の先頭に置くことになっていますし、そもそもタクソノミーの条件が一つだけなら省略できます。

    その上でご質問にお答えしますが、これは一度表示した投稿を記録しておき、以後の WP_Querypost__not_in に指定してしまうことで実現できると思います。

    <?php
    $terms = get_the_terms($post, 'カスタムタクソノミー名');
    $exclude = array($post->ID, 1340, 1341);
    foreach ( $terms as $term ):
        $args = array(
            'post__not_in' => $exclude,
        );
        $my_query = new WP_Query( $args );
        while ( $my_query->have_posts() ):
            $my_query->the_post();
            $exclude[] = $post->ID;
    ?>
    
    <!-- 表示内容 -->
    
    <?php
        endwhile;
        wp_reset_postdata();
    endforeach;
    ?>

    上記は抜粋ですが、ポイントは

    1. foreach の直前で $exclude を初期化。
    2. $argsexclude$exclude を指定。
    3. while 内の the_post() の直後で $exclude に表示中の投稿IDを追加。

    の3点です。
    ところで、投稿IDの1340と1341は除外してよろしかったですね?

    LABE様

    ご連絡ありがとうございます。
    ご指定いただきましたコードを使用しましたところ
    無事に解決いたしました!

    ありがとうございます。

    また、exclude や relation について知識不足にて失礼いたしました。

    おっしゃる通り、1340,1341は除外で問題ございません。

    この度は、とても助かりました!

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「カスタムタクソノミーの関連記事表示で同じ投稿が重複して出てきます。」には新たに返信することはできません。