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('未分類')を追加指定することで、特定のカテゴリーを非表示にできます。

Share on
関連記事
WordPressでタームの一覧を投稿数の多い順で表示する方法
WordPressでタームの一覧を投稿数の多い順で表示する方法
WordPressの記事にプラグインなしで目次を作る方法
WordPressの記事にプラグインなしで目次を作る方法
WordPressでコメントに届くセルフピンバックを停止する方法
WordPressでコメントに届くセルフピンバックを停止する方法