WordPressで親カテゴリ毎に子カテゴリの記事一覧を表示する

WordPressで親子カテゴリが設定されてるときに get_posts で子カテゴリの一覧リストを作る方法。WP_Query版もあります。サンプルコードつき。

WordPressで親カテゴリ毎に子カテゴリの記事一覧を表示する

WordPressで過去記事の一覧を出すには wp_get_archives というテンプレートタグが手軽です。でも専門性が低い雑記ブログだと極めて使い勝手が悪いってことで、カテゴリ別に記事一覧リストを出力したい。( ・`д・´)

カテゴリ別の記事一覧は前にも実装してたのですが、get_posts() を使った方がスッキリするし、他の設定に依存しないので書き直してみました。

wp_get_archivesで出力する記事一覧

単に過去記事一覧を出すだけなら、wp_get_archives で書き出せます。

【PHP】
<?php wp_get_archives(“type=postbypost”); ?>

日報的なブログや非常に専門性の高いサイトでは十分なのでしょうが、事実上 日付だけでしか並べ替えられないのはちょっと不満。(´・ω・`)

それを受けて書いたカテゴリ別のソート方法がこれ。

【 関連記事 】

カテゴリ別に記事リストを作るカテゴリごとの記事一覧をWP_Queryで表示する【WordPress】

全記事をカテゴリ別に並べてみました。

親カテゴリに子カテゴリのリストを表示する

前回「全てのカテゴリについて記事一覧を出す」というのを作ったので、今度は「親子カテゴリが設定されてるとき親カテゴリに子カテゴリのリストを出す」のが欲しい。

こういうやつ作ります。
WordPressでカテゴリ別の記事一覧(テキスト版)

親カテゴリ→子カテゴリをそれぞれ回すのでループが増える感じです。

子カテゴリの記事一覧を出す関数

【PHP】
<?php
function each_category_archive() {
  global $post;
 
  $cat_info = get_the_category();
  $cat_term = $cat_info[0] -> category_parent;
  $cat_info = get_categories( 'child_of='.$cat_term );
 
  foreach ($cat_info as $category) {
    setup_postdata($category);
    $str = '<h2><a href="'. get_category_link( $category->term_id ) .'">'. $category->cat_name .'</a>の記事一覧</h2>
            <ul>';
    // 'posts_per_page'に好きな数を入れて件数を調整できます
    $ozPosts = get_posts( 'posts_per_page=-1&order=DESC&category__in='.$category->term_id );
    foreach( $ozPosts as $post ) {
      if($category->count != 0) {
      setup_postdata($post);
      $title = get_the_title();
      $str .= '<li><a href="'. get_permalink() .'">'. $title .'</a></li>';
      }
    }
    wp_reset_postdata();
   
    $str .= '</ul>';
   
    $strFinal .= $str; // $strの出力をキャッシュ
  }
  wp_reset_postdata();
 
  return $strFinal;
}
?>

関数にまとめてあるので、どこか邪魔にならないところに動かせます。

アイキャッチ画像も出したいときは…

アイキャッチ(サムネイル画像)も表示したいときは、2番目のforeachの内側にある「$title = get_the_title();」の代わりに次のコードを入れて下さい。

【PHP】
if ( has_post_thumbnail() ) { // サムネイルを付けるとき
  $title = get_the_title();
  $args = array('alt' => $title);
  $ozThumbnail = get_the_post_thumbnail( get_the_ID(), 'thumbnail', $args );
} else { // サムネイルが設定されてないとき
  $ozThumbnail = '<img src="'.get_template_directory_uri().'thumbnail.png">';
}

画像が設定されてないときの代替画像はテーマディレクトリの直下です。パスが通らないようなら適切な位置に設定し直して下さい。

表示用コード

実際に表示したい場所で関数を呼び出します。

【category.php】
<?php echo each_category_archive(); ?>

ほぅら、スッキリ。w(・∀・)w

…って、トクホかよ。

なお、以下の記事を参考にしました。
WP子カテゴリ別記事一覧取得(清書済み)|mellowchanter

ただ、この記事のメインループの呼び出しに使われてる query_posts() は現在非推奨コードとされてます。メインクエリを書き換えうるので別のコードに差し替えるかー、というのが本稿の主旨でした。

コードのカスタマイズ例

備忘録がてらにカスタマイズ例のメモ。

表示順序を入れ替える

表示順序を変えたいときはorderby が使えます。それぞれ order で昇順と降順を切り替えられます。

  • orderby=ID … カテゴリID
  • orderby=name … カテゴリ名(アルファベット順)
  • orderby=slug … スラッグ
  • orderby=count … 投稿数
  • order=ASC … 昇順
  • order=DESC … 降順

元記事には orderby=order というパラメータが紹介されていて、 Category Order が有効とあったので「ほほー」って思ったんですけど Category Order ってプラグインの機能なんですね。…ということで本稿では割愛。

親カテゴリを除外

親カテゴリが含まれると重複になる場合は、category__in で親カテゴリを除外します。

$cat_term 経由で $category に親カテゴリの情報が入るので、必要に応じて突っ込んで下さい。

'category__in='.$category->term_id

History Calendar – Chrome ウェブストア

記事数0の空カテゴリを除外

記事が登録されてない空カテゴリの除外は、カテゴリ情報の count で登録記事数を見て判別します。


if($category->count != 0){
表示用コードいろいろ
}

ちなみにHTMLにPHPを埋め込むときは中括弧を使うとエラーが出るので、PHPを出たり入ったりしたいときは次の記法を使って下さい。


<?php (中略) if($category->count != 0): ?>
// 表示用コードいろいろ
<?php (中略) endif; ?>

このとき、表示部に直接書き込んで1行目と最終行を抜いて下さい。

おわりに

うちみたいな雑記ブログはカテゴリ別に記事を表示しないと見通しが悪いので、重い腰を上げて改修してみた次第です。

んが、ブログ記事を半分くらい書いたところで似たような記事を前に書いてたことに気付くなど。(´ཀ`」∠):_

えーと、内容はそれなりに違うので別解ってことでよろしくお願いします。…というか、サイドバーの人気記事ランキングを見てたらちょうどそのカテゴリ別に書き出す記事が出てきて「ギャー」って思いました。