WordPress #8 | 記事ページのテーマを実装
WordPressのテーマ開発8日目。
ひととおり、画面デザインを作成したのでカスタムテーマとして実装していく。今日は日報カテゴリーの記事ページと月別アーカイブを作っていった。
やっていて感じているが、WordPressはとにかくコーディングが楽しくない。例えばアーカイブページを作成する際、各投稿の日付のDateオブジェクトだけとか、カテゴリー名だけ、といった個別に情報を取得する術が無いので、ちょっとした機能を追加するだけで「すべての記事の内容から抜き出して」とか「その記事の全カテゴリーの中から探索して」という力技を常にやらなければならない。記事データベースから直接データを取りゃいいという事なんだろうが、それはそれでまた美しさが無いし、そもそもそれではWPを利用していない。
例として、このようなコード。
<?php
$category = get_the_category();
$cat_name = $category[0]->cat_name;
$cat_slug = $category[0]->slug;
$cat_parent_id = $category[0]->parent;
if ($cat_parent_id !== 0) {
$cat_parent = get_category($cat_parent_id);
$cat_name = $cat_parent->cat_name;
$cat_slug = $cat_parent->slug;
}
$cat_en = str_replace( '-', ' ', $cat_slug);
echo '<div class="cat-name-en">'.$cat_en.'</div>';
echo '<div class="cat-name-ja">'.$cat_name.'</div>';
?>
これはただ、記事に紐づけているカテゴリー名の中からカテゴリーの階層上、一番親となるカテゴリー名を抜き出して、それを表示させるというコード。
普通に考えれば、一番親になるカテゴリーがリストの0番目にくるようにしておく、もしくは階層を指定して取得するメソッドを用意しておけば良いと思うのだが、WordPressではそれが出来ない。
子カテゴリーが配列の最初にきている事もあるので、列挙されたカテゴリーから「親が存在しないもの」を抽出するという、非常に非生産的なコードを書く必要があるわけだ。
また、それに反して、リンク付きのHTMLリストを出力するテンプレート関数では非常に細かなパラメータが用意されている。次のパラメータはwp_list_categoriesで指定出来るパラメータなのだが、なぜこれをオブジェクトとして返してくれないのだと、本当にイライラする仕様になっているわけだ。
<?php wp_list_categories('depth=1'); ?>
depthパラメータはその階層までのカテゴリーリストを取得出来る。つまり一番親の階層にあるカテゴリーを取得するにはdepth=1とすればいいわけだ。
普通にget_the_categoryメソッドでもこれをやらせてくれればいいのに・・・と。
またこんなのもある。
<?php
$catid = get_the_category();
$myCat = $catid[0]->cat_ID;
wp_list_categories('current_category='.$myCat);
?>
current_cateogryパラメータは、現在のカテゴリーとして表示するカテゴリーを指定して、ある投稿を表示させているときに属するカテゴリーに「current-cat」と言うクラスや親カテゴリーには「current-cat-parent」と言うクラスをつけるというパラメータなのだが、なぜこの機能をget_the_categoryで出来るようにしておかないんだ?と誰も今まで思わなかったのだろうか?と。
終始、こんな感じなので簡単な動的コンテンツを実装するだけでも果てしなく時間が経過してしまう設計だ。
結局今日は記事ページを実装出来ただけ。これならそりゃmicroCMS使った方が、月額のサービス料考えても安く済むわけだと今更ながらに思っている。