WordPressカスタマイズ事例

アーカイブページで、ターム(カテゴリ)ごとに分けて記事一覧を表示する

いろいろ製品があってそれをカテゴリ、ジャンルごとに分けて一覧表示したい、というニーズは結構あります。
そんなときの解決方法をご紹介。
 
ここでは例として カスタム投稿タイプを items、 カスタム分類名を items_cat として、
テーマのカスタム投稿アーカイブページ(archive-items.php とします)の記事一覧表示部分をこんな感じで記述します。

<?php
// カスタム投稿タイプ
$post_type = 'items';
// カスタム分類名
$taxonomy = 'items_cat';
// パラメータ
$args = array(
// 親タームのみ取得
'parent' => 0,
// 子タームの投稿数を親タームに含める
'pad_counts' => false,
// 投稿記事がないタームは取得しない
'hide_empty' => true,
'orderby'=> 'order'
);
// カスタム分類のタームのリストを取得
$terms = get_terms( $taxonomy , $args );
if ( count( $terms ) != 0 ) {
// 親タームのリスト $terms を $term に格納してループ
foreach ( $terms as $term ) {
// 親タームのURLを取得
$term = sanitize_term( $term, $taxonomy );
$term_link = get_term_link( $term, $taxonomy );
if ( is_wp_error( $term_link ) ) {
continue;
}
$slug = $term->slug;
// 親タームのURLと名称を出力
echo '<h2><a href="' . esc_url( $term_link ) . '" >' . $term->name . '</a></h2>
<div>';
$posts = get_posts( array(
'post_type' => $post_type,
'taxonomy' => $taxonomy,
'term' => $slug,
'posts_per_page' => -1,
'meta_key' => 'order_num',
'orderby'     => 'date',
'order'	=>	'DESC'
));
foreach($posts as $post){
setup_postdata( $post );
$image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'medium' );
$image_url_hon = $image_url[0];
?>
<div>
<a href="<?php the_permalink(); ?>" ><img src="<?php echo $image_url_hon; ?>" /></a>
<p><a href="<?php the_permalink(); ?>" ><?php the_title(); ?></a></p>
</div>
<?php
}
wp_reset_query();
?>
</div>
<?php }
} ?>

タームの一覧を取得して、そのタームごとに記事を取得表示する、というフローです。


関連するWordPressカスタマイズ事例