WordPressには、記事のリストを出力するタグ wp_list_pages があるが、投稿(post)で同じようなことをするタグがない。
でも、CMSとしてWordPressを使うときに、ページじゃなくて投稿の方で管理したいときも結構あるのだ。
というわけで、投稿で
・同一カテゴリー内の記事リストを出力
・自分が今いる記事をハイライト
する、つまりサブメニューを作成するのが悲願だった。
今まで2回にわたって「同一カテゴリー内の記事一覧」を出す方法を模索してきたが、どうにか実用レベルのものが出来た。
1回目のものは、カテゴリーの数だけ同じコードをコピペ改変して貼り付けなくてはならなかった。
2回目のものは、記述は1回ですむものの、コメントの表示が混じり合ってしまうという致命的欠陥があった。
今回の方法は、
・同一カテゴリー内の記事リストを出力
・自分が今いる記事をハイライト
という目的に一応合致しています。
プラグインを一つ使っています。
coffee2code.com » Blog Archive » Plugin: Customizable Post Listings
これはリストの出力を色々とカスタマイズしてくれるプラグインなんですが、これをそのまま使うだけだと目的の半分も達成できないので、色々と工夫しました。
まずコードはこんな感じ
<?php if(is_single() || is_category()) : ?>
<?php if (function_exists('wp_list_posts')) {;?>
<?php $cat = get_the_category(); $cat = $cat[0]; {
//echo "$cat->cat_ID" ;
} ?>
<ul id="sub_navi">
<?php c2c_get_recent_posts(
$num_posts = 100,
$format = "<li id='post-%post_id%'>%post_URL%</li>",
$categories = "$cat->cat_ID",
$orderby = 'date',
$order = 'DESC',
$offset = 0,
$date_format = 'm/d/Y',
$authors = '',
$include_passworded_posts = false) ; ?>
</ul>
<?php } ;?>
<?php endif; ?>
まず、最初にシングルかカテゴリートップのときだけ出力するように分岐させる。
3行目ではカテゴリーIDを取得。カテゴリーIDは配列形式でしか取り出せないのでちょっと面倒。次のechoはデバッグ(確認)用です。
次のプラグイン変数内の引数は、プラグインのページで確認してもらうとして(名前で大体分かりますよね)、注目は
$format = "<li id='post-%post_id%'>%post_URL%</li>",
$categories = "$cat->cat_ID",
の2つ。後でハイライトさせるために、リストにポストIDをふるのと、「自分のいるカテゴリーの時だけ出力させる」ために先ほどのカテゴリーIDをぶちこむ。
ハイライト処理
ハイライト処理を実現するために、header.phpのhead内にこんな記述をしておくと吉。
本当はlistの中に current-item とか出力させたいんだけど。
<?php while (have_posts()) : the_post(); ?>
<style type="text/css">
<!--
#post-<?php the_ID(); ?> a {
font-weight: bold;
color: #000000;
text-decoration: none;
}
-->
</style>
<?php endwhile; ?>
</head>
追記
ハイライトの事を考えなくていいなら、「同一カテゴリ内のリストを出力するプラグイン」自体は存在する。
WPのプラグイン:Other Posts from Cat
ただこれは「関連記事」のようなかたちで記事の後に出力することを想定しているプラグインの模様。
あ、このプラグインもDagonDesignだ。