サポート » 使い方全般 » 特定のタクソノミーのタームとそれに属する記事を動的に出力したい

  • カスタム投稿の特定のタクソノミーがあります。
    それに属するターム名・タームスラッグ・記事をすべて取得したいです。
    ちなみに、タームは随時増えていくので、タームが増えても同じようにどんどん表示されるようにしたいです。

    今は下記のようにコードをタームがあるだけ書いていましたが、今後も増えていくので
    手動では不可能になってしまいました。

    
    <div class="container">
    <div>
    <h2>タームスラッグ<span class="title">ターム名</span></h2>
    <div>
    <ul id="list">
    <?php $args = array(
      'nopaging' => true,
      'post_type' => 'products',
      'tax_query' => array(	
    array(	
      'taxonomy' => 'YYY',
      'field' => 'slug',
      'terms' => 'A',
     )
      ),
        );
    $customPosts = get_posts($args);
      if($customPosts) : foreach($customPosts as $post) : setup_postdata( $post ); 
    ?>
    <li><?php $img = get_field('img');
        $imgurl = wp_get_attachment_image_src($img, 'large');
        if($imgurl){ ?>
      <a href="<? echo $imgurl[0]; ?>" style="background: url(<? echo $imgurl[0]; ?>);"></a>
      <? } ?>
    <div class="p_caption"><p class="product_p">ターム名</p>
     <h3 class="product_title">
        <?php $title = get_the_title($ID); echo $title; ?></h3>
      </a>
    </div>
    </li>
    <?php endforeach; ?>
    <?php endif; wp_reset_postdata(); ?>
        </div>
      </div>
    </div>

    もっと簡潔に、タームが増えても順に増えていくように記述することはできますか?
    よろしくお願い致します。

    • このトピックはsasasa24が7年、 8ヶ月前に変更しました。
15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック投稿者 sasasa24

    (@sasasa24)

    ちなみにイメージはこのような感じです。
    http://www.fastpic.jp/viewer.php?file=3907898459.jpg

    画像を見てもはっきりイメージが沸かないまま回答して申し訳ないのですが、get_termsのリファレンスに

    指定されたタクソノミー(カスタム分類)またはタクソノミーのリストについて、それに含まれるタームを取得します。

    とありますので、タームが追加されてもそのタクソノミーに属するタームを全て取得できるようです。
    これで意図されている出力を実現できないでしょうか?

    取得できたタームをループしてget_postsすればできるように思うのですが、イメージが違いますでしょうか。

    トピック投稿者 sasasa24

    (@sasasa24)

    munyagu様
    回答ありがとうございます。
    恐らく、munyagu様のイメージで間違いないかと思います。
    リファレンスを私も見たのですが、いまいち分からずこちらで質問させて頂いた次第です。

    だいたいこんな流れでは?

    $args = array(
      ...  // タクソノミー YYY
    );
    $terms = get_terms( $args );
    foreach ( $terms as $t1 ) {
      $args = array(
        ...,  // カスタム投稿タイプ XXX
        ...,  // タクソノミー YYY
        ...   // ターム $t1
       );
      $posts = get_posts( $args );
      foreach ( $posts as $p1 ) {
        // 投稿一覧
      }
    }
    

    最初の部分を間違えました。すみません、正しくは

    $terms = get_terms( 'タクソノミー YYY' );
    
    トピック投稿者 sasasa24

    (@sasasa24)

    gblsm様
    ご回答ありがとうございます。参考に以下コードを記述し、出力することはできました。
    ですが、
    'terms' => $t1->term_id
    の部分がうまく動いていないようで、全記事ターム順もバラバラに出力されてしまいました。
    記述方法が違うのでしょうか?

    <?php  	
        $terms = get_terms( 'product_cat' );
    	foreach ( $terms as $t1 ) {
    		$args = array(
    			'post_type' => 'products',
    			'taxonomy' => 'product_cat',
    			'terms' => $t1->term_id, 
    			"posts_per_page" => -1
    		);
    		$posts = get_posts( $args );
    		print_r($t1->term_id);
    		print_r( $posts );
    ?>
    

    get_posts() の説明ページ(Codex日本語版)の用例に「タクソノミーパラメータ」があります。その2番目の例を読みましょう。詳細は WP_Query のタクソノミーパラメータのセクションを確認してください。
    https://wpdocs.osdn.jp/テンプレートタグ/get_posts
    https://wpdocs.osdn.jp/関数リファレンス/WP_Query#Taxonomy_Parameters

    トピック投稿者 sasasa24

    (@sasasa24)

    gblsm様
    ご丁寧にありがとうございます。
    tax_queryを使うのですね。勉強になりました。
    下記コードによりお陰様で順に出力することに成功しました。

    <?php  	
        $terms = get_terms( 'YYY' );
    	foreach ( $terms as $t1 ) {
    		$args = array(
    			'post_type' => 'XXX',
    			'posts_per_page' => -1,
    			'tax_query' => array(
    				'taxonomy' => 'YYY',
    				'terms' => $t1->term_id
    			)
    		);
    		$posts = get_posts( $args );
    		foreach ( $posts as $post )  { 
    			setup_postdata( $post );
    ?>
    	<h2>
    		<?php if ($terms = get_the_terms($post->ID, 'YYY')) {
    			foreach ( $terms as $term ) {
    			echo esc_html($term->slug);
    				}
    			} 
    		?>
    		<span class="title">
    			<?php if ($terms = get_the_terms($post->ID, 'YYY')) {
    				foreach ( $terms as $term ) {
    				echo esc_html($term->name);
    					}
    				} 
    			?>
    		</span>
    	</h2>
        
    	<ul id="list">
    		<li>
    			<div class="caption">
    				<h3>
    					<?php $title = get_the_title($ID);
    							$title = str_replace("  ", "<br />", $title);
    							echo $title; 
    					?>
                    </h3>
    					<?php $txt = get_field('ccc');
                                        if($txt){ 
    					?><p><? echo $txt; ?></p>
                        <? } ?>
    			</div>
    		</li>
    	</ul>
    <?  	}
    	}
    ?>

    そこでまた別の問題があり、もし分かればアドバイスください。
    上記の記述だと、<h2>がすべての記事に表示されるのですが、
    これを、タームごとで一括りのブロックにして、ターム名とタームスラッグは見出しとして各ブロックに1回だけ表示させるようにしたいのですが、何かいい方法はないでしょうか?
    よろしければアドバイスをお願い致します。

    <h2>...</h2> を2番目の foreach の手前へ移せばよいのでは?

    トピック投稿者 sasasa24

    (@sasasa24)

    gblsm様
    度々ありがとうございます。
    やってみましたが、現在はタームが3つあるのですが、そのうち1つしか表示されませんでした。
    タームごとにブロックに分けるのは難しいのでしょうか・・。

    sasasa24さん、今はどんなコードになっていますか?
    「自分がどのようにやったか(今回の内容であればコードですね)」も一緒に伝えましょう。
    「〜されませんでした。」と結果だけを示されると、原因を想像するのがとても大変なんです。

    大雑把にこんなコードを想像しているんですが。

    $terms = get_terms( 'YYY' );
    foreach ( $terms as $t1 ) {
      // ここで $t1 の名前とスラッグを表示
      
      $args = array( 投稿タイプXXX, タクソノミーYYY, ターム$t1 );
      $posts = get_posts( $args );
      foreach ( $posts as $p1 ) {
        // 投稿一覧
      }
    }
    

    foreachの勉強がてら、ブログ内に存在するすべてのタグを取得し1件ずつ表示させるループを書いた[WordPress]
    はまってるときは案外気づきにくいものだが、レスがついても自助努力はすることで開ける道もあるのでは。

    • この返信は7年、 8ヶ月前にoisitが編集しました。

    @oisit さん、リンクが私のコメントを指していますが、mypacecreatorさんのブログですよね?
    http://mypacecreator.net/blog/archives/1574

    ご指摘ありがとうございます。
    大口たたいて墓穴を掘るとはお恥ずかしい限りです。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「特定のタクソノミーのタームとそれに属する記事を動的に出力したい」には新たに返信することはできません。