サポート » 使い方全般 » 記事ページに同じタームに属する記事一覧を表示したい。

  • 行き詰っており、どなたか教えてください。

    カスタム投稿名「aaa」と、カスタム投稿名「bbb」があり、
    どちらにもアドバンスカスタムフィールドにて、categoryのタクソノミーを追加。
    フィールド名:products-cate/返り値:タームID

    aaa内の、ある記事が「あいうえお」というタームに属しており、
    その記事を表示している時に、bbbの投稿記事にも「あいうえお」というタームに属している記事がある場合は、
    その一覧も一緒に表示したいのですが、うまくいきません。

    現在、single-aaa.phpには以下のように記述

    <?php
     global $post;
     $term = array_shift(get_the_terms($post->ID, 'products_cate'));
     $args = array(
      'numberposts' => 8,
      'post_type' => 'aaa',
      'taxonomy' => 'products_cate', 
      'term' => $term->slug, 
      'orderby' => 'rand',
      'post__not_in' => array($post->ID) 
     );
    ?>
    <?php $myPosts = get_posts($args); if($myPosts) : ?>
    <?php foreach($myPosts as $post) : setup_postdata($post); ?>
     <p><?php the_title(); ?></p>
    <?php endforeach; ?>
    <?php else : ?>
     <p>関連アイテムはまだありません。</p>
    <?php endif; wp_reset_postdata(); ?>

    宜しくお願いいたします。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • sarasarariさん

    ご確認ですが、
    結論的にはカスタムフィールドで指定したターム一覧を記事ページにソートしたい感じでしょうか?

    下のソースどちらか試して頂けますでしょうか。

    簡単で申し訳ございません。

    
    <?php
    
    //「aaa」「bbb」は投稿タイプ
    
    //パターン1
    $custom_term_id = get_field('products-cate');
    $args = array(
    	'post_type'  => array('aaa','bbb'),
    	'numberposts' => 8,
    	'meta_key'   => 'age',
    	'orderby'    => 'meta_value_num',
    	'orderby' => 'rand',
    	'post__not_in' => array($post->ID),
    	'meta_query' => array(
    		array(
    			'key'     => 'products-cate',
    			'value'   => array( $custom_term_id ),
    			'compare' => 'IN',
    		),
    	),
    );
    
    //products-cateのカスタムフィールドの値をソート
    
    //パターン2
    $custom_term_id = get_field('products-cate');
    $args = array(
    	'numberposts' => 8,
    	'post_type' => array('aaa','bbb'),
    	'taxonomy' => 'products_cate',
    	'field' => 'ID',//ID or slug
    	'terms' => array( $custom_term_id ),//term_id
    	'orderby' => 'rand',
    	'post__not_in' => array($post->ID) 
     );
    
    //カスタムフィールドで指定した値をタームIDとしてソート
    
    ?>
    

    mura0403さま

    ありがとうございます。
    説明が下手で申し訳ありません。

    ご教授いただいたソースで試したところ、
    どちらも表示されるのですが、products-cateにある
    タームの全てを表示してしまうため、
    それぞれの記事で選択したタームに属する記事を表示しているときは、
    その同じタームの記事のみを表示できないでしょうか?

    タームは追加される場合があるため、不特定です。

    分かりにくくて申し訳ございません。
    何卒、宜しくお願いいたします。

    未検証ですが、
    mura0403さんのコードの

    $custom_term_id = get_field('products-cate');

    ここを

    $custom_term_id = get_field('products-cate', $post->ID);

    にすればどうですか。

    未検証ですが、以下のコードとかどうですか?
    「’relation’ => ‘AND’,」はいらないかもしれないです。

    
    $custom_term_id = get_field('products-cate');
    $args = array(
    	'post_type'  => array('aaa','bbb'),
    	'numberposts' => 8,
    	'orderby' => 'rand',
    	'post__not_in' => array($post->ID),
    	'relation' => 'AND',
        'meta_query' => array(
    	       array(
    			'key'     => 'products-cate',
    			'value'   => array( $custom_term_id ),
    			'compare' => 'IN',
    		   ),
    	
    	'tax_query' => array(
    	         'taxonomy' => 'products_cate',
    	         'field' => 'ID',//ID or slug
    	         'terms' => array( $custom_term_id ),//term_id
               )
    
         ),
    
    );
    

    カスタムフィールドは記事の入力用と割り切って、分類にはカスタム分類利用すればいいのではないでしょうか。

    本文中に表示する内容 → カスタムフィールド
    投稿を分類する → カスタム分類

    同じ内容を2度入力しないといけないのがめんどくさいと言えばめんどくさいですが。

    mura0403さま

    ご丁寧にありがとうございます。
    以下のように記述したのですが、aaaの内容しか表示されません。
    どうしたら良いでしょうか?

    <?php
    
    $custom_term_id = get_field('products-cate');
    $args = array(
    	'post_type'  => array('aaa','bbb'),
    	'numberposts' => 8,
    	'orderby' => 'rand',
    	'post__not_in' => array($post->ID),
    	'relation' => 'AND',
        'meta_query' => array(
    	       array(
    			'key'     => 'products-cate',
    			'value'   => array( $custom_term_id ),
    			'compare' => 'IN',
    		   ),
    	
    	'tax_query' => array(
    	         'taxonomy' => 'products-cate',
    	         'field' => 'ID',//ID or slug
    	         'terms' => array( $custom_term_id ),//term_id
               )
    
         ),
    
    );
    
    ?>
    
     
    <section>
    <?php if(have_posts()): ?>
    <?php while(have_posts()): the_post(); ?>
    
    <!--aaaの記事内容--->
    <h1><?php the_title(); ?></h1>
    <div id="textAria">
    <?php if( get_field('ks_tx01') ) { ?>
    <?php the_field('ks_tx01'); ?>
    <?php } ?>
    </div>
    
    <!--bbbに同じproducts-cateに属する記事がある場合は表示--->
    <div id="saleBox">
    <div class="shiyou">
    <?php if( get_field('spec') ) { ?>
    <?php the_field('spec'); ?>
    <?php } ?>
    </div>
    </div>
    
    <?php endwhile; ?>
    <?php  endif; ?>
    </section>

    sarasarariさん

    whileをクエリーなしでつかわれてる?感じがしますので
    下記の方に合わせてみてはいかがでしょうか?

    もしくはforeachか、

    もっとこまかい設定はSQL関数とかになってしまうかもしれません。

    
    <?php
    
    $args = array(
    //query条件を定義
    );
     
    //メインループ
    if ( query_posts( $args ) ) :
    query_posts( $args );
    while ( have_posts() ) :
    the_post();
    ?>
     
     <p>投稿のループ</p>
     
    <?php endwhile; else: ?>
     
     <p>投稿がなかったときの処理</p>
      
    <?php
    endif;
    wp_reset_postdata();
    
    ?>
    
    

    @mura0403 さん

    query_posts 関数の使用は推薦されていません。詳細は以下をご覧ください。

    テンプレートタグ/query posts
    https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts

    注 1: この関数はプラグインまたはテーマの中で使われることを想定されていません。後ほど出てくる説明にあるように、メインクエリーを変更するにはパフォーマンス面でも優れたより良いオプションが存在します。

    注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。モダンな WordPress コードではもっと安定したメソッドを使うべきです。例えばpre_get_posts フックを使った方法などです。ひとことで言うと、query_posts() は決して使うべきではありません。

    kuck1uさん

    ありがとうございます。
    勉強になります。

    kuck1uさんご質問させてください。
    functions.phpなどでてきおうしづらいルール的な条件が難しいものについては、SQLをつかうべきなのでしょうか?

    @mura0403 さん

    functions.phpなどでてきおうしづらいルール的な条件が難しいものについては、SQLをつかうべきなのでしょうか?

    状況は色々とあると思うので “これ!” という回答は難しいですが、少なくとも投稿データを取得するという内容では SQL 文を書く必要はないと思います。wp_query を駆使すれば、取得できないことはないと思います。

    kuck1u様

    ありがとうございます。
    色々と調べてみたいと思います。

    sarasararさん、余計な質問してしまいすみませんでした。

    同じタームに属する記事一覧を表示したい

    とありますが、Advanced Custom Fields でメタデータを追加しているの、カスタムフィールドの値が一致する投稿を取得したいという解釈でよいでしょうか?

    ソースコード
    https://pastebin.com/yKn3k1tV

    使い方
    上記 URL のソースコードを functions.php にペーストし、single.php の好きなところに wpforum218064_recommend_posts(); を追加してください。 ポストタイプなどは環境に合わせて変更してください。

    提案
    このケースの場合、2つに共通するカスタム分類を追加、または既存のカスタム分類の場合は紐づく投稿タイプを変更して wp_query に tax_query 指定するのがよいと思います。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「記事ページに同じタームに属する記事一覧を表示したい。」には新たに返信することはできません。