WordPress : 各カテゴリの記事リストを出力する

各カテゴリの記事リストを出力

ブログ記事にはだいたいカテゴリというのがあって、ブログのサイドバーにはカテゴリ一覧などといったものが出力されていることが多いです。しかしそれ以上のものはなかなか目にする機会がありません。
訪問者視点で考えてみると、カテゴリ一覧を見たいと思った場合は「どういうカテゴリがこのブログにはあるのか」、つまり特定の記事カテゴリを目的に探すというよりも、「ブログの傾向を概観したい」とか「どんな記事がそれぞれにあるのか」をざっと見てみたい、そういう場面が多い気がします。
書き手(ブログ執筆者)としては明確な意図があって記事を銘々のカテゴリに振り分けているわけですが、訪問者がカテゴリ一覧を見るときはもっとぼんやりとしているのではないでしょうか。

そうして考えてみると、単にカテゴリを一覧で出力(表示)しているだけでは、そのような訪問者の深層意図を必ずしもフォローできません。
そんなことを考えていて、以前からカテゴリ・アーカイヴでは各カテゴリから数記事を出力した、ブログ全体を俯瞰的に把握できるようなページにしたいと思っていました。

今回初めてやってみたのでちょっち面倒ですがやり方を紹介。


まず流れをざっと説明すると、

  1. 親カテゴリへのリンクと概要を ID から引く。
  2. その下に子カテゴリへのリンクと概要を ID から引く。
  3. 子カテゴリに属する記事をリストで出力。
  4. (2)~(3)を該当親カテゴリに属する子カテゴリ分繰り返す。
  5. (1)~(4)を親カテゴリ分繰り返す。

このような感じになります。尚、私はカテゴリを親カテゴリ+子カテゴリの2世代で用意しています。また、記事のカテゴリ分けは全て子カテゴリに対してであって親カテゴリのみへの振り分けはしていません。

  • 親カテゴリ
    • 子カテゴリ1
    • 子カテゴリ2
    • 子カテゴリ3

とあったら、私のブログでは全ての記事は子カテゴリの1ないし3に振り分けられており、「『親カテゴリ』に属しているがどの『子カテゴリ』にも属していない」というのはありません。
よって上記の流れでは、親カテゴリから直接記事をリストで出力はしていません。もし親カテゴリだけに振り分けている記事がある場合は、以下の方法では「出力されない記事がある」ということになります。


まず各カテゴリへのリンクは get_category_link で取得します。

[php]
<a href="<?php echo get_category_link(カテゴリID); ?>">カテゴリ名</a>
[/php]

各カテゴリの概要文は category_description で取得します。

[php]
<?php echo category_description(カテゴリID); ?>
[/php]

これらはループ外から任意のカテゴリを引き出せるので、今回のようなページに使えるわけです。

ただ、カテゴリ指定のためのパラメータには「カテゴリ ID」しか使えないのが難点です。カテゴリ名、もしくはスラッグなどでできると非常に便利なのですが…。

カテゴリ ID の確認法

[Dashboard] – [Posts] – [Categories] で表示されるカテゴリ管理の画面から、各カテゴリの編集画面に飛べばアドレスに

taxonomy=category&tag_ID=20

などと表示されているはず。その tag_ID=20 がそれ。
もちろんわざわざ編集画面に飛ばなくてもリンクにマウスオーヴァーで確認できる。

カテゴリ ID は名前順で振られるわけではない上、WordPress からエクスポート→インポートする度に変わります。例えばローカルで作業したテンプレートファイル(テーマファイル)をいざアップロードしてみると、カテゴリ ID にローカルのテスト環境 WordPress とウェブの本番 WordPress では差異があるのでそこを修正しないといけません。これが地味に面倒です。
# データベースごとローカル環境にリビルドすればカテゴリ ID も変わらないでしょうが、個人的にそっちのほうがより面倒なのでやっていません。


そして各指定カテゴリの記事を取得・出力するには query_posts を使用します。

テンプレートタグ/query posts – WordPress Codex 日本語版
Function Reference/query posts ≪ WordPress Codex

クエリポスト・タグは出来ることが多すぎてよく分かっていないんですが、簡単に言えば「好きなループを作れる」という感じでしょうか。いつ・誰が・何を、自由に投稿をループで出せると。
つまりここでは「特定のカテゴリに属する投稿を取得、表示させる」わけです。

[php]
<?php

// The Query
query_posts( ‘パラメータ’ );

// The Loop
while ( have_posts() ) : the_post();
echo ‘<li>’;
the_title();
echo ‘</li>’;
endwhile;

// Reset Query
wp_reset_query();

?>
[/php]

これで指定したパラメータの投稿ループをリスト形式で表示させられます。
# 表示する数は [Dashboard] – [Settings] – [Reading] で指定した数。トップページとかで表示する件数と同じ。

このパラメータには色々あるのですが、カテゴリだけでも様々な引数(ひきすう)があります。先ほど「カテゴリ ID だけじゃなくてスラッグにも対応していればいいのに」と書きましたが、query_posts は対応しています。

[php]
<?php query_posts( ‘category_name=art’ ); ?>
[/php]

とかでいけます。しかし get_category_linkcategory_description では ID で指定せざるを得ないので、私は一律 ID で指定しています。

具体的にはこのような感じです。
# カテゴリ ID が 20 の場合。

[php]
<?php

// The Query
query_posts( ‘cat=20’ );
echo ‘<li>’;
echo category_description(20);
echo ‘</li>’;

// The Loop
while ( have_posts() ) : the_post();
echo ‘<li>’;
echo ‘<a href="’;
the_permalink();
echo ‘">’;
the_title() ;
echo ‘</a>’;
echo ‘<footer>’;
the_time(‘M d, Y’);
echo ‘</footer>’;
echo ‘</li>’;
endwhile;

// Reset Query
wp_reset_query();

?>
[/php]

これによって出力されるコードはこう。
# 概要文はなぜか paragraph で囲まれる。

[php]
<li><p>概要文</p></li>
<li><a href="記事1へのパーマリンク">記事タイトル1</a>
<footer>Mar 28, 2012</footer>
</li>
<li><a href="記事2へのパーマリンク">記事タイトル2</a>
<footer>Feb 20, 2012</footer>
</li>
<li><a href="記事3へのパーマリンク">記事タイトル3</a>
<footer>Jan 12, 2012</footer>
</li>
[/php]

これをカテゴリの数だけ繰り返せば、各カテゴリの最新記事がまとめて出力されます。

やってみた感じとてもいいです。自分としても思いがけない昔の記事が見えたりして面白いですね。「このカテゴリではしばらく書いてないんだなあ」とか(笑)。
カテゴリ ID をひとつひとつ指定するのが地味な上、汎用性に大いに欠けますが、他にベターな方法を知らないのでとりあえずこれで動かしています。

  • Posted at 21:20 on Mar 28, 2012
  • | No comments yet

Response

  • 現在、この投稿へのコメント/トラックバックは受け付けていません。