親カテゴリーの子カテゴリーのタイトル出力【カスタム投稿】

wordpress

[php] <?php // get_termsで特定タクソノミーのタームを取得してタームごとにforeach開始 $target_post = ‘(投稿タイプのスラッグ)’; $target_post_cat = ‘(タクソノミーのスラッグ)’; $post_count = -1; $cat_args = array( ‘parent’ => 0, //トップレベルのタームのみ ‘hierarchical’ => 0 //子タームを含めない ); $cats = get_terms($target_post_cat, $cat_args); foreach( $cats as $cat ): ?> <?php // 親タームタイトルを表示 $target_cat_slug = esc_html($cat -> slug); $target_cat_name = esc_html($cat -> name); ?> <h2><?php echo $target_cat_name; ?></h2> <?php //タームごとに子ターム取得(孫ターム・投稿記事を持たないタームを除外) $child_cats = get_terms($target_post_cat,’hierarchical=0&hide_empty=1&parent=’.$cat -> term_id); ?> <?php //子タームがある場合の処理 if( $child_cats ) : ?> <?php //投稿記事を持つ子タームスラッグを除外用配列に格納(foreach内) foreach( $child_cats as $child_cat ){ $exclude[] = esc_html($child_cat->slug); } ?> <?php //子タームを持つタームで、親タームにのみを設定した投稿のループ、除外用配列を使用 $args = array( ‘post_type’ => $target_post, ‘tax_query’ => array( //ここからタクソノミーのパラメーター ‘relation’ => ‘AND’, array( ‘taxonomy’ => $target_post_cat, //カスタム分類(カスタムタクソノミー) ‘field’ => ‘slug’, //タクソノミータームの種類をスラッグで指定する ‘terms’ => $target_cat_slug //タームからスラッグ取得  ), array( ‘taxonomy’ => $target_post_cat, //カスタム分類(カスタムタクソノミー) ‘field’ => ‘slug’, //タクソノミータームの種類をスラッグで指定する ‘terms’ => $exclude, //除外タームスラッグ取得  ‘operator’ => ‘NOT IN’ //除外 ) ), ‘post_status’ => ‘publish’, ‘posts_per_page’ => $post_count, // 表示するページ数 ‘orderby’ => ‘menu_order’, // 必要な場合に指定 ‘order’ => ‘DESC’ // 並び順 ); $my_query = new WP_Query($args); ?> <?php if( $my_query->have_posts() ) : ?> <ul> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php endif; ?> <?php //子タームを設定した投稿のループ(foreach内) foreach( $child_cats as $child_cat ): ?> <?php $child_cat_name = esc_html($child_cat -> name); $target_cat_slug = esc_html($child_cat->slug); ?> <h3><?php echo $child_cat_name; ?></h3> <?php $args = array( ‘post_type’ => array($target_post), ‘taxonomy’ => $target_post_cat, ‘term’ => $target_cat_slug, ‘post_status’ => ‘publish’, ‘posts_per_page’ => $post_count, // 表示するページ数 ‘orderby’ => ‘menu_order’, ‘order’ => ‘DESC’ // 並び順 ); $my_query = new WP_Query($args); ?> <?php if( $my_query->have_posts() ) : ?> <ul> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php endif; ?> <?php endforeach; ?> <?php //子タームがない場合の処理 else: ?> <?php $args = array( ‘post_type’ => array($target_post), ‘taxonomy’ => $target_post_cat, ‘term’ => $target_cat_slug, ‘post_status’ => ‘publish’, ‘posts_per_page’ => $post_count, // 表示するページ数 ‘orderby’ => ‘menu_order’, ‘order’ => ‘DESC’ // 並び順 ); $my_query = new WP_Query($args); ?> <?php if( $my_query->have_posts() ) : ?> <ul> <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul> <?php endif; ?> <?php endif; ?> <?php //$postをリセットしてforeach終了 wp_reset_postdata(); ?> <?php endforeach; ?> [/php]

こんな感じで出力されます。

[html] <h2>ターム1</h2> <h3>子ターム1</h3> <ul> <li><a href="">タイトル1</a></li> <li><a href="">タイトル2</a></li> <li><a href="">タイトル3</a></li> </ul> <h2>ターム2</h2> <h3>子ターム2</h3> <ul> <li><a href="">タイトル4</a></li> <li><a href="">タイトル5</a></li> <li><a href="">タイトル6</a></li> </ul> <h2>ターム3</h2> <h3>子ターム3</h3> <ul> <li><a href="">タイトル7</a></li> <li><a href="">タイトル8</a></li> <li><a href="">タイトル9</a></li> </ul> <h3>子ターム4</h3> <ul> <li><a href="">タイトル10</a></li> <li><a href="">タイトル11</a></li> <li><a href="">タイトル12</a></li> </ul> [/html]