自分のサイトはカテゴリの階層をあまり深くしない(つまり、子カテゴリ・サブカテゴリなどを作成しない)んですが、年末、知人のサイトをボランティアでリニューアルする作業を請負いました。
知人がなんだか細かい指示を出してくるなーーと思ったら、子カテゴリがある場合でも、親カテゴリのアーカイブページには、全部一緒に分類もされずに表示されているので、ユーザービリティ悪いのではないかということなんです。
私としては、メニュバーでナビゲートしてるので、子カテゴリがある場合は、わざわざ親カテゴリをクリックして、記事一覧を見るだろうか、という疑問が残りますが、管理人の依頼なので仕方がありません。
必死に検索してもなかなかよいサンプルがなく、困りましたが、ついに行き着いたのがこちら。
それでやってみたら、カテゴリアーカイブは大丈夫でしたが、ほかのアーカイブ(月別、タグ別など)が表示されない!
がびーーん!
数日放置したあと、時間がとれたので最初にディフォルト(今回はWedding Bells)のテンプレに戻ってみてアーカイブページを見ると、
<?php if (have_posts()) : ?>
<?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
<?php /* If this is a category archive */ if (is_category()) { ?>
<h2 class="pagetitle">Archive for the ‘<?php single_cat_title(); ?>’ Category</h2>
<?php /* If this is a tag archive */ } elseif( is_tag() ) { ?>
<h2 class="pagetitle">Posts Tagged ‘<?php single_tag_title(); ?>’</h2>
<?php /* If this is a daily archive */ } elseif (is_day()) { ?>
<h2 class="pagetitle">Archive for <?php the_time('F jS, Y'); ?></h2>
<?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
<h2 class="pagetitle">Archive for <?php the_time('F, Y'); ?></h2>
<?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
<h2 class="pagetitle">Archive for <?php the_time('Y'); ?></h2>
<?php /* If this is an author archive */ } elseif (is_author()) { ?>
<h2 class="pagetitle">Author Archive</h2>
<?php /* If this is a paged archive */ } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?>
という感じに書いてあったので、なるほど、カテゴリアーカイブの条件分岐部分にこれを挿入すればいいのだなと思ってやったら・・・
うまくいったんだけど、記事リストが二重に出てくる部分がある。
そうでないカテゴリもあったので、親カテゴリにもチェックが入っているせいかなと思ったんだけど、それでも改善されない。
悩んでもう一度テンプレを見ると、
下の部分に
<?php while (have_posts()) : the_post(); ?>
<div <?php post_class('archive-post'); ?>>
<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>
<small>Posted on <?php the_time('l, F jS, Y') ?></small>
</div>
<?php endwhile; ?>
がある。
これが問題だ。
ここを削除すると、二重は出てこないが、やはりほかのアーカイブが表示されないので、仕方ないから、ベタなやり方だけど、それぞれの条件分岐の下に
<?php if (have_posts()) : the_post(); ?>
<div <?php post_class('archive-post'); ?>>
<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>
<small>Posted on <?php the_time('l, F jS, Y') ?></small>
</div>
<?php endif; ?>
と書いてやった。
そしたら見事成功。
この辺の条件分岐、もう少しスマートに書けると思うんだけど、取り急ぎこれで対処。