特定カテゴリー専用のテンプレートを作る

投稿者: | 2008年3月23日

Web用語集を始めるにあたって、WordPressのテンプレートを改造しましたが、そのとき少々つまづいたことや判ったことの覚書です。

全体としてやりたかったことは次の通りです。

  1. 用語解説は”words”というカテゴリーの記事として投稿するものとする
  2. “words”の記事は初期画面には現れないようにする
  3. “words”の記事はナビゲーションメニューのリンク(”about”の下)を設置し、それをクリックしたときだけ表示される
  4. “words”ページのテンプレートは、”Recentpost”に”words”カテゴリの記事だけを全数表示して、用語のIndexとする。

先ず1は良いとして、2については簡単そうで意外とややこしい、というか新たな知識が必要になります。

特定カテゴリだけ特別扱いにする

記事を呼び出すのはthe_content()タグなんですが、これにはカテゴリーでソートするような機能はありません。

で、色々と調べていたら、query_posts()というタグがありまして、これを記事呼び出しループの直前に持ってくることにより、自由に抽出条件を設定できるようです。

例えば、”words”カテゴリはid=10なので、それ以外つまり否定にしたいときは、頭にマイナスをつけてquery_posts(“cat=-10”)とすれば良いらしい。おお、ちゃんとできました!

ちなみにこのタグは色々と使い道がありますね。詳しくはタグ辞典へ。

特定カテゴリのテンプレートを作成

次に3ですが、別ページなんだから単純にページ機能で作ろうと考えました。

で、上のquery_posts() タグを使って簡単に”word”ページのテンプレートをつくったは良いが、どうも様子がおかしい。最新の記事しか現れないのです。”次へ>>”ボタンとか押しても変わりません。

そこでようやく気付きました。ページ機能はそんな使い方はしない、全く変化しないページに使うんだと。

じゃあ何を使うかと言うと、カテゴリー毎のアーカイブです。当たり前ですけど(^^;

普通は”category”以下のリンクの一つとして表示される”words”というリンクを、あたかも別ページであるかのように、ナビゲーションメニューのところへ持ってくれば良いのでした。

具体的には先ず、(通常はheaderテンプレート内の)wp_list_cats()で呼び出されているカテゴリへのリンク一覧から、wordsカテゴリを取り除く為にwp_list_cats(‘exclude=10’)とします。(ここでは”cat=-1″じゃなくて”exclude・・・”なのね)

次に、 元々出力されていたwordsカテゴリは固定リンクなので、これをナビゲーションメニューのところへ持ってくる。これで完了です。

特定カテゴリのテンプレートを作る

続いて4ですが、先ずwordsカテ用テンプレートとして、category-10.phpというファイルを作ります。(index.phpなどをべースにして)

当然コンテンツはwordsカテの記事だけなので、先の便利タグでquery_posts(“cat=10”)とすれば良い・・・かと思いきやその必要もない。元々選んだカテゴリの記事しか表示されないのだからループの前には何も必要ない。

変更が必要なのはRecentPost(最新の記事一覧)の部分。これはそのままだと、全カテゴリの記事が表示されるので、これをwordsカテゴリだけにして用語のindexとしたい。

であれば、wp_get_archives(‘type=postbypost&limit=8’) などで呼び出されているものに、category=10とかの引数を追加すれば、wordsだけ抽出できるだろう・・・と思いきやそんな引数は無い!

じゃあどうするのか?ネットで検索したら・・・プラグイン?イヤイヤもっと簡単な方法がありました、タグリファレンスに。

< ?php $posts = get_posts('numberposts=30&category=10'); foreach($posts as $post) : setup_postdata($post); ?>

<li><a xhref="<?php the_permalink() ?>"><?php the_title(); ?></a></li>

< ?php endforeach; ?>

このようにget_posts()配列を呼び出して、foreachでタイトルとパーマリンクを取り出すのでした。

それにしても、wp_get_archives()で直接カテゴリをソートできないとは、ちょっと使い勝手が悪いですね。

アーカイブ用テンプレートの作成

これでようやく完成!と思いきや、またもや問題が。words以外のカテゴリを選択したときに、 ちゃんとソートされなくなってしまいました。(出てくる記事のカテゴリがデタラメ)

これは?・・・しばらく考えた後気付きました、先ほどindex.phpを弄ったからだと。

index.phpは初期画面だけでなく、特に指定が無い限り、カテゴリも含めたアーカイブ選択結果の頁にも使われます。ここで、先ほど記事表示ループの前に付けたquery_posts(“cat=-10”)が悪さをしているのでした。

なので、アーカイブ表示用テンプレート(archive.php)を新たに作ります。これは単に改造する前のindex.phpと同じもの、つまりquery_posts()をつけなければ良いのです。

今後の課題

と言う訳で、以上が現在までの経緯です。本当は用語集のシングルページも専用に作りたいのですが、まだやり方が判っていません。

いずれにしろ、ちょっとしたことが案外簡単に出来ない、というのが正直な感想です。

関数が沢山ある割に、欲しい機能(引数)が無いので、また別の関数を使って補強する感じでしょうか。基本的にブログとして普通に使っていれば簡単ですが、CMSとして使おうとすると若干回りくどい処理が必要になるようです。

まあ、ブログシステムなんだからそれが当然といえば当然なのかもしれません。 その意味では用途に合ったまた別のシステムを試してみるのが良さそうです。

特定カテゴリー専用のテンプレートを作る」への1件のフィードバック

  1. 管理人タイチ

    上の記事に訂正があります(横線部分)。実はページ機能を使っても良かったのです。”words”テンプレートでquery_posts(”cat=10″)を使って、用語集だけ表示することは出来ました。

    ただし、(more..)部分を含めた全文が表示されてしまいます。これはWPの仕様で「ページ機能とは全文表示するもんだ!」WPJapanフォーラムに書いてありました。

    ですのでやるとすれば、the_excerpt()を使って抜粋を表示する位でしょうか。僕は良いですが、いくずく殿がわざわざ抜粋に記入してくれるかな?

    いずれにしろ、上の記事のように、特定カテゴリーのアーカイブとして表示する方法とページ機能を使うやり方の二通りがあるという事です。とりあえず今は両方搭載しておかしなことになっています。まあおそらくページ機能を利用する方が自然な感じはしますね。

    返信

管理人タイチ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です