Top

メモ書き

カスタム投稿の記事をカテゴリー毎に並べて表示させる方法を紹介します。
今回紹介する方法では、カテゴリーを複数選んでも最初の当てはまるカテゴリーのところで記事が吐き出されてしまいます。(あてはまるカテゴリーすべてで同じ投稿を表示させることは不可)
つまりは、1投稿につき1カテゴリーという制限付きです。実は前回、前々回と更新してきた記事はこちらを紹介したかったからなんですよね。ちなみに前回、前々回の記事の内容はこちら。

“1投稿につき1カテゴリー” をシステムで制限してしまうのもになります。更新時の取り決めにしてしまうのもいいですが、システム上できないようにしておけば、エラーの連絡が入る心配もなくなります。

【コピペOK】カスタム投稿の記事をカテゴリー毎に並べて表示させる方法

さっそく結論となるコードから。

<?php
  $my_tax = 'faq-cat';  //取得したいタクソノミー名
  $parent_terms = get_terms( $my_tax, array( 'parent' => 0) );  //第一階層のタームだけ取得
  if ( !empty( $parent_terms ) ) :
?>
<ul>
	<?php 
	foreach ( $parent_terms as $term ) : 
	  $pt_name = $term->name;
	?>
	<li class="list__faqCat--box">
		<div><?php echo $pt_name; ?></div>
		<?php
			$paged = get_query_var('paged') ? get_query_var('paged'): 1;
			$args = array(
				'posts_per_page' => -1,
				'paged' => $paged,
				'orderby' => 'post_date',
				'order' => 'ASC',
				'post_type' => 'faq',
				'post_status' => 'publish',
				'tax_query' => array(
					array(
						'taxonomy' => 'faq-cat',
						'field' => 'slug', 
						'terms' => $term->slug
					)
				)
			);
			$the_query = new WP_Query($args);
			if( $the_query->have_posts() ):
		?>
		<ul>
			<?php
				while( $the_query->have_posts() ): $the_query->the_post();
			?>
			<li>
				// 投稿の内容
			</li>
			<?php endwhile; ?>
		</ul>
		<?php endif; wp_reset_query(); ?>
	</li>
	<?php endforeach; ?>
</ul>
<?php else: ?>
	// 記事がない時の表示
<?php endif;?>

それでは解説を。
全体を通してカテゴリーを取得、そのカテゴリーの中の記事を並べる、並べ終わったら次のカテゴリーで同じく記事を並べる、、、これを繰り返しています。

get_terms() 関数でタクソノミーの第一階層のタームを取得、取得したタームが空でない場合、処理を続行します。foreach() ループで、取得したタームを順番に処理、クエリで取得した投稿が存在する場合、while() ループで投稿を順番に処理といったところですね。

ページネーションをつけるのは不自然になるので自然と’posts_per_page’ => -1,になります。
今回もFAQのページを想定して記述してあります。投稿した記事全てを並べることになるため、投稿が増えた時に重くなったりしがちですのでご注意を。