【WP】ループ内で特定の親カテゴリーの子カテゴリーだけを一覧表示する方法
2021/2/13
2024/11/14
3419 views
ループ内で子カテゴリーリスト
タイトルの通りですが、投稿の親カテゴリーの子カテゴリーだけのリンクを表示させる方法です。
single.phpでその記事に属するカテゴリーに対しても使えます。
以下のコードを記述ください。
基本的な記述
<?php $categories = get_terms( 'category', array( 'orderby' => 'count', 'hide_empty' => 0, 'child_of' => 2, ) ); foreach($categories as $value): ?> <p><a href="<?php echo get_category_link($value->term_id); ?>"><?php echo $value->name;?></a></p> <?php endforeach; ?>
※参考コードは親カテゴリーが「2」の場合です
応用編)属する記事をリスト表示する方法
親カテゴリとそれに属する子カテゴリ、さらにその子カテゴリに属する記事タイトルを一覧表示するコードは、以下のように構成できます。
このコードでは、get_terms で親カテゴリと子カテゴリを取得し、それぞれの記事一覧を WP_Query を使って取得して表示するようにします。
すべての親を取得する場合
<?php
// 親カテゴリの取得
$parent_categories = get_terms('category', array(
'orderby' => 'count',
'hide_empty' => 0,
'parent' => 0 // 親カテゴリだけを取得
));
foreach ($parent_categories as $parent_category) :
// 親カテゴリの名前を表示
echo '<h2>' . $parent_category->name . '</h2>';
// 子カテゴリの取得
$child_categories = get_terms('category', array(
'orderby' => 'count',
'hide_empty' => 0,
'child_of' => $parent_category->term_id
));
foreach ($child_categories as $child_category) :
// 子カテゴリの名前を表示(リンクなし)
echo '<h3>' . $child_category->name . '</h3>';
// 子カテゴリに属する記事一覧を取得
$args = array(
'category__in' => array($child_category->term_id),
'posts_per_page' => -1 // 全件表示
);
$query = new WP_Query($args);
if ($query->have_posts()) :
echo '<ul>';
while ($query->have_posts()) : $query->the_post();
// 記事タイトル(リンクあり)を表示
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
endwhile;
echo '</ul>';
wp_reset_postdata();
else :
echo '<p>記事がありません。</p>';
endif;
endforeach;
endforeach;
?>
特定の親を取得する場合
<?php
// 特定の親カテゴリ(ID: 2)に限定して取得
$parent_category_id = 2;
// 子カテゴリの取得
$child_categories = get_terms('category', array(
'orderby' => 'count',
'hide_empty' => 0,
'child_of' => $parent_category_id
));
if (!empty($child_categories)) :
// 親カテゴリの名前を表示
$parent_category = get_term($parent_category_id, 'category');
echo '<h2>' . $parent_category->name . '</h2>';
foreach ($child_categories as $child_category) :
// 子カテゴリの名前を表示(リンクなし)
echo '<h3>' . $child_category->name . '</h3>';
// 子カテゴリに属する記事一覧を取得
$args = array(
'category__in' => array($child_category->term_id),
'posts_per_page' => -1 // 全件表示
);
$query = new WP_Query($args);
if ($query->have_posts()) :
echo '<ul>';
while ($query->have_posts()) : $query->the_post();
// 記事タイトル(リンクあり)を表示
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
endwhile;
echo '</ul>';
wp_reset_postdata();
else :
echo '<p>記事がありません。</p>';
endif;
endforeach;
else :
echo '<p>子カテゴリがありません。</p>';
endif;
?>
コードのポイント
親カテゴリの取得:最上位の親カテゴリを取得し、親カテゴリ名を表示します。
子カテゴリの取得:各親カテゴリに対して、その子カテゴリを get_terms を使って取得し、名前を表示します。
記事一覧の取得:各子カテゴリに対して、WP_Query を使用してそのカテゴリ内の記事を全件取得し、リンク付きでタイトルを表示します。
これで、複数の親カテゴリがあり、その子カテゴリと記事タイトルを親カテゴリごとに整理して表示できます。
以上です。
ご不明なことなどあればコメントください。
こんにちは。いつもサイトを参考にさせていただいてます。
foreachの中に属する記事一覧も表示できるでしょうか?
具体的にはarchive.phpで親カテゴリ(リンクなし)に属する子カテゴリ一覧(リンクなし)を表示して、それぞれの子カテゴリに属する記事タイトル(リンクあり)を全件表示したいのですが可能でしょうか。親カテゴリは複数あり並び順を上記のようにしたいです。アドバイスありましたらご教示お願いいたします。
池田さん
コメントありがとうございます。
上記検証し、後ほどアップできればと思っております。
お待たせしました。記事に追加させていただきましたので、検証いただけましたらと思います。
記事追加いただきまして、ありがとうございます。
思った通りの実装ができました。ありがとうございました。