ブログには月別、カテゴリー別、タグ別など様々なアーカイブページがあり、訪問者は過去のエントリーを月別、カテゴリー別、タグ別に見ることができます。
WordPressでは月別アーカイブページをdate.php、カテゴリーアーカイブページをcategory.php、タグアーカイブページをtag.phpという名前でそれぞれ独自にテンプレートを作成することで各ページに表示される内容を自由にカスタマイズできます。[*1]
ただし一つ問題があるんですが、各アーカイブページに表示されるエントリー数は、管理メニューの「設定」→「表示設定」内にある「1 ページに表示する投稿数」に指定した数だけしか載らないんです。
これではせっかくアーカイブページ用に作成した独自テンプレートが全く活かせませんね。
そこでプラグインの登場なんです。
上記のエントリーで分かりやすく解説されていますが、Custom posts per pageというプラグインを導入して、各アーカイブページに表示されるエントリー数を好きなように変更します。
具体的には、perpage.phpの11行目あたりにある以下の部分について
$posts_per['home'] = 4; $posts_per['day'] = 10; $posts_per['month'] = 10; $posts_per['search'] = 10; $posts_per['year'] = 999; $posts_per['author'] = 999; $posts_per['category'] = 999;
それぞれの数字を表示させたいエントリーの数に変更すればいいだけです。
例えば、home画面に表示されるエントリー数を10にしたい時には、
$posts_per['home'] = 10;
とします。
同様に、検索結果の画面に表示されるエントリー数を20にしたい時には、
$posts_per['search'] = 20;
と書き換えてあげます。
カテゴリーページにはデフォルトで999になっていますが、通常はこれ以上のエントリーを表示するような場面は少ないと思われるため、ここはこのままでいいと思います。
また、ここにはタグアーカイブページ用の設定ができないため、うちのブログでは少しコレに手を加えさせていただきました。
まずは先ほどの
$posts_per['home'] = 4; $posts_per['day'] = 10; $posts_per['month'] = 10; $posts_per['search'] = 10; $posts_per['year'] = 999; $posts_per['author'] = 999; $posts_per['category'] = 999;
の一番下に
$posts_per['tag'] = 999;
と書き加えます。
そして次に
$query = new WP_Query();
$query->parse_query($query_string);
if ($query->is_home) {
$num = $posts_per['home'];
} elseif ($query->is_day) {
$num = $posts_per['day'].'&order=ASC';
} elseif ($query->is_month) {
$num = $posts_per['month'].'&order=ASC';
} elseif ($query->is_year) {
$num = $posts_per['year'].'&order=ASC';
} elseif ($query->is_author) {
$num = $posts_per['author'];
} elseif ($query->is_category) {
$num = $posts_per['category'];
} elseif ($query->is_search) {
$num = $posts_per['search'];
}
この部分の一番下に
} elseif ($query->is_search) {
$num = $posts_per['tag'];
}
と書き加えます。
これでtag.phpでもdate.phpやcategory.phpと同様に表示されるエントリー数を制御できるようになりました。
ちなみに、古いエントリーを一番下に表示し、上に行くほど新しいエントリーにしたい場合には該当ページの”ASC”を”DESC”に書き換えるといいですよ。
例えば、
} elseif ($query->is_year) {
$num = $posts_per['year'].'&order=ASC';
これを
} elseif ($query->is_year) {
$num = $posts_per['year'].'&order=DESC';
こういう風に変更します。
まぁデフォルトで降順のようですから敢えてDESCと書かずに省略してもいいです。
} elseif ($query->is_year) {
$num = $posts_per['year'];
私はコレになかなか気付かなくて四苦八苦しました(笑)
あとは先ほどのエントリーにも出てましたように、各アーカイブページに沿ったテンプレートファイルを作成すればOKです。
私の場合は番号リストにしましたが、ulをolに変えただけですのでほとんどそのまま引用させていただきました。
<ol>
<?php if ($posts) : foreach ($posts as $post) : start_wp(); ?>
<li><?php the_time('l, F d, Y') ?> at <?php the_time('h:i a') ?> : <a href="<?php the_permalink() ?>" title="Permanent link to <?php the_title(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
</ol>
これで以下のようにアーカイブページをリスト表示にすることができました。

まぁ定義リストとか使って横並びにした方が綺麗っちゃあ綺麗ですね(笑)
それはそれでまた時間のある時にやってみます。
【追記-2008.11.30-】
各テンプレートファイルへの記述ですが、start_wpというのが気になったので調べてみたんですけど、別に
<ol>
<?php if(have_posts()): while(have_posts()): the_post(); ?>
<li><?php the_time('D, M d, Y') ?> at <?php the_time('h:i A') ?> : <a href="<?php the_permalink() ?>" title="Permanent link to <?php the_title(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
</ol>
これでも問題なく動作しましたので変更しました。
- これらが存在しない場合にはindex.phpが代用されます。 [↑]



