記事本文
カテゴリアーカイブにサブカテゴリを表示させる
Movable Type 3.11 のサブカテゴリ機能についての所感 (2) サブカテゴリの設定の失敗例 にて、
デフォルトのテンプレートでは、ある記事にサブカテゴリのみを設定していた場合、親カテゴリのアーカイブにはその記事は含まれません
と述べました。
今回は、親カテゴリを指定することなく、サブカテゴリの指定のみで親カテゴリのアーカイブに反映させるテンプレートについて書きます。
デフォルトのカテゴリアーカイブ
デフォルト・テンプレート - カテゴリーアーカイブを見ると、そのカテゴリに属する記事の内容が
<MTEntries> 〜 </MTEntries>
で囲まれているのがお分かりでしょうか。
テンプレート・タグ - MTEntries - category=``category name'' によると、 MTEntries テンプレート・タグに category 属性を指定することで、そのカテゴリに属する記事を表示することができるということになります。
しかし、カテゴリアーカイブはそのアーカイブ自体が属するカテゴリを内部的に持っているため、 category 属性を指定してはいけません。
( 指定しても、再構築時にエラーとなるわけではありません。
しかし、仮にカテゴリアーカイブにて
<MTEntries category="mt"> 〜 </MTEntries>
といった記述をしてしまうと、全てのカテゴリにおいて
<MTEntries category="Foo AND mt"> 〜 </MTEntries>
と指定したことと同じになってしまうため、 mt カテゴリに属していない記事は表示されなくなってしまいます。 )
よって、カテゴリアーカイブにおける
<MTEntries> 〜 </MTEntries>
は、そのカテゴリに属する記事を全て表示する、ということになります。
( category 属性以外の属性、たとえば lastn 属性などで更に絞込みをすることは可能です。 )
しかし、これはあくまでそのカテゴリのみが表示対象となるため、そのカテゴリにサブカテゴリが存在していても、サブカテゴリは別のカテゴリとして扱われ、サブカテゴリの記事は含まれません。
MTEntriesWithSubCategories テンプレート・タグ
そこで、サブカテゴリ機能の実装と共に追加されたのが、 MTEntriesWithSubCategories テンプレート・タグです。
- MTEntriesWithSubCategories
サブカテゴリーを認識しているMTEntriesコンテナ・タグの代わり。 これをカテゴリー・アーカイブ・テンプレートの中でMTEntriesの代わりに使って、テンプレートにそのカテゴリーに属するサブカテゴリーの全エントリーを含めるようにします。
アトリビュート:
- Category
設定されると、MTEntriesWithSubCategoriesは、カテゴリーのOR付きリストとそのすべてのサブカテゴリーにまで拡張します (例: ``Parent Category OR Sub Category 1 OR Sub Category 2 OR Sub Sub Category 3 ... '')
そのほかの引数はすべて直接MTEntriesに渡されます。
<MTEntries> 〜 </MTEntries>
の代わりに、
<MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories>
とすることで、そのカテゴリにサブカテゴリが設定されている場合、サブカテゴリの記事も含めて表示することになります。
MTEntriesWithSubCategories の実例
実際に、
<MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories>
を用いたカテゴリアーカイブがどのように作られるかを示してみようと思います。
Movable Type 3.11 のサブカテゴリ機能についての所感 (2) サブカテゴリの設定の失敗例にて例に出した Template sample 3.11 default: firefox アーカイブですが、
<MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories>
を用いる前は、 extension サブカテゴリを持っているはずの firefox カテゴリアーカイブに、 extension カテゴリの記事が表示されないという状態になっていました。
そこで、
<MTEntries> 〜 </MTEntries>
を
<MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories>
に書き換えて再構築をすると、 firefox カテゴリアーカイブに、無事 extension カテゴリの記事を表示することができました。
親カテゴリにおける注意点
カテゴリの運用方法にもよると思いますが、サブカテゴリ機能を使っていると、記事が存在しない親カテゴリというものが生じることがあります。 先ほど別件で作成した、 TuneDoc を例にとってみましょう。
TuneDoc - permutation-city というカテゴリアーカイブがあります。 これはトップレベルカテゴリが favourites カテゴリであり、そのサブカテゴリである irc カテゴリの更にサブカテゴリとして存在します。 このとき、 irc カテゴリや favourites カテゴリは、サブカテゴリを総称する意味しか持っておらず、その直下には記事が配置されていません。
こういったカテゴリにおける問題点については Ogawa::Memoranda: サブカテゴリー機能について考えてみた。 - 問題点の説明に詳しく書かれてありますが、
親カテゴリーのアーカイブがそもそも生成されないという現象
が発生します。
実際に http://hxxk.jp/mt/template_sample/tunedoc/favourites/irc/ や http://hxxk.jp/mt/template_sample/tunedoc/favourites/ にアクセスしても、 index.php ( この場合はカテゴリアーカイブ ) が存在しないために 403 Forbidden が返されるはずです。
デフォルトのテンプレートでは、 Main Index にカテゴリが階層化された状態で表示され、記事が存在しないカテゴリについてはリンクを張らないような条件式のテンプレートタグが使われているので、あまり気にする必要はないのかもしれません。 しかし、サブカテゴリのアーカイブを表示して、そこからブラウザのアドレスバーの URI を削って上の階層を見ようとした場合、またはカテゴリアーカイブ上で上の階層へのリンクを作成した場合などに不都合が出る可能性は充分にありますので、気に留めておいた方が良いかもしれません。
なお、親カテゴリがサブカテゴリを総称する意味で存在しているのではなく、基本的に親カテゴリに記事を配置して、その中でさらにカテゴリを絞る意味でサブカテゴリが使われている場合 ( たとえば、 TuneDoc - news と TuneDoc - mass-communication の例 ) はこの問題は関係ありません。

