WordPressでカテゴリーごとの投稿一覧を表示する方法

WordPressで投稿のカテゴリーのタイトルを表示して、そのカテゴリーに属する投稿を一覧表示する方法の備忘録です。
トップページや固定ページなどで、カテゴリーごとに整理された記事リストを出力したい場合に活用できます。
カテゴリーを表示する
はじめに、カテゴリーのタイトルを一覧の見出しとして表示します。
以下のカテゴリー一覧を取得するコードをテンプレートファイルに記述します。
<?php
$categories = get_categories(array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => true,
));
foreach ($categories as $category) {
echo '<h3>' . esc_html($category->name) . '</h3>';
}
?>
get_categories()で全カテゴリーを取得します。配列では、取得したカテゴリーを名前順に並べ替えています。
取得した各カテゴリーをforeachでループ処理してh3タグの見出しで出力します。
カテゴリーごと記事一覧を表示する
カテゴリーのタイトルが表示できたら、その配下に属する投稿記事の一覧を表示するコードを追加します。
<?php
$categories = get_categories(array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => true,
));
foreach ($categories as $category) {
echo '<h3>' . esc_html($category->name) . '</h3>';
echo '<ul>';
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'cat' => $category->term_id,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<li><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></li>';
}
}
wp_reset_postdata();
echo '</ul>';
}
?>
先ほど作成したカテゴリーのタイトルの下に、該当の投稿記事を一覧表示するコードを追加しました。
アーカイブのような通常の投稿一覧ページとは異なり、ページの一部で特定の投稿を表示する場合は、WP_Queryのサブループを使用します。
WP_Queryのパラメーターでcatに現在のカテゴリーIDを指定し、posts_per_pageで投稿を5件取得しています。
ループの最後にはwp_reset_postdata()を記述して、投稿データをリセットします。
取得条件のカスタマイズ
用途に合わせて、取得するカテゴリーの条件を変更することが可能です。
投稿記事がないカテゴリーも取得する
上記のコードでは、投稿がないカテゴリーは除外されますが、hide_emptyパラメーターを調整することで表示可能です。
$categories = get_categories(array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => false,
));
'hide_empty' => falseに変更することで、記事を持たない空のカテゴリーも取得されます。
子カテゴリーは表示しない
階層構造を持つカテゴリーのうち、親カテゴリーのみを抽出したい場合はparentを指定します。
$categories = get_categories(array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => false,
'parent' => 0,
));
'parent' => 0を追加することで、トップレベルの親カテゴリーのみが表示されるようになります。
表示しないカテゴリーを指定する
「未分類」など、特定のカテゴリーを一覧に含めたくない場合はexcludeを使用します。
$categories = get_categories(array(
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => false,
'exclude' => get_cat_ID('未分類'),
));
'exclude' => get_cat_ID('未分類')を追加指定することで、特定のカテゴリーを非表示にできます。


