記事本文
記事内目次
カテゴリアーカイブの特徴
Movable Type 3.11 のサブカテゴリ機能についての所感 (3) - デフォルトのカテゴリアーカイブでも同じようなことを述べましたが、改めて述べます。
カテゴリアーカイブは、大雑把に言うと category=``category name'' を指定した状態と同じようなアーカイブです。
例えば、 MT hxxks - customize titles という、 customize カテゴリの記事タイトル一覧のアーカイブがありましたが、その中の
<MTEntries>
は
<MTEntries category="customize">
と指定したのと同じ状態になります。
よって、カテゴリアーカイブ内のナビゲーション部分で記事リストを作ろうとすると、既に category name で抽出された中から作られます。
例えば、 customize カテゴリにおける
<MTEntries lastn="N">
という指定は、
<MTEntries category="customize" lastn="N">
と指定されたことと同じになってしまい、 customize カテゴリの中の最新 N 件の記事リストが作成されます。
同様に、カテゴリアーカイブ内のナビゲーション部分でカテゴリリストを作ろうとすると、これも既に category name で抽出された中から作られます。
例えば、 customize カテゴリにおける
<MTCategories>
という指定でカテゴリ一覧を作ろうと思っても、 customize カテゴリ以下に存在するカテゴリのリストしか作れません。
カテゴリアーカイブ内でも全カテゴリのリストを作る
カテゴリアーカイブ内でも、その他のページと同様にカテゴリリストを作成したい場合は、 MTSubCategories を MTTopLevelCategories に置き換えれば良いです。 テンプレート・ タグ - MTTopLevelCategories にて解説されていますが、
MTSubCategoriesのクローン。 ただし、カテゴリー階層の最上位で常に開始します。
というように、現在のカテゴリ階層に関係なく最上位、すなわち weblog 全体のカテゴリからカテゴリリストを作成します。
カテゴリアーカイブ内でも全記事の新着記事リストを作る (1)
カテゴリアーカイブ内で、カテゴリの中での最新 N 件での表示ではなくて、全体の最新 N 件の記事リストを作りたい場合はいくつかの方法があります。 一つは、 MTInclude を用いる方法です。
MTInclude には module 属性と file 属性のどちらかを指定するようになっています。
- module
-
主にテンプレートの記述を簡略化する目的で用います。
例えば、ヘッダなど、すべてのHTMLファイルに共通する部分があって、その部分をMovable Typeを使って管理したいとき、共通部分をテンプレート・モジュールにして、その名前を
Headerに設定した後で、<MTInclude>を使って、次のように読みこみます。<$MTInclude module="Header"$>あくまでモジュールであるため、本来のテンプレートの性質を継承します。
- file
-
外部ファイルを読み込むことで、本来のテンプレートの性質に関係なく、記事リスト等を作成できます。
今回のような目的で MTInclude を使う場合は、 module 属性ではなく file 属性を指定します。 module 属性を使った場合、モジュールを呼び出した時点ではテンプレートタグを読み込んでいるだけなので、実際のアーカイブ生成の際はカテゴリアーカイブの性質を継承してしまうためです。
-
「メインページ」テンプレートから、新しい記事を表示する部分をコピーします。
<ul> <MTEntries lastn="10"> <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li> </MTEntries> </ul> -
「新しいインデックス・テンプレートを作る」から、新規テンプレート「 recent_entries 」を作成し、テンプレートの中身に先程のコードを貼り付けます。 ここでは、ファイル名を「 recent_entries.html 」と設定します。 なお、「インデックス・テンプレートを再構築するときにこのテンプレートを自動的に再構築する」のチェックを外さないようにしてください。
-
カテゴリアーカイブのテンプレートの、任意の場所に
<$MTInclude file="recent_entries.html"$>と記述して、再構築を行うと完成です。
カテゴリアーカイブ内でも全記事の新着記事リストを作る (2)
MTInclude 以外に、 PHP や SSI を使って include する方法もあります。
前項の手順で、アーカイブテンプレートの
<$MTInclude file="recent_entries.html"$>
を PHP または SSI の記述に置き換えるだけです。
この方法と MTInclude は、似ているようで大きな違いがあります。
このファイルはページがリビルトされるそのときに読み込まれます。 SSI (Server Side Includes)と混同しないように注意してください。 SSIはウェブサーバにリクエストが来るたびに、毎回外部ファイルを読み込みます。
<MTInclude>を使う場合は、まず外部ファイルを編集した後、編集されたページを読み込むためにリビルドしてください。
新たな記事を書いた場合、 recent_entries.html 自体は自動でリビルドされます。 しかし、 MTInclude で recent_entries.html を読み込んでいる場合、その読み込んでいる元のアーカイブをリビルドしない限り、前回のリビルド時点の recent_entries.html が読み込まれたままになります。 例えば、月別アーカイブとカテゴリアーカイブの両方で recent_entries.html を読み込んでいた場合に、一方だけをリビルドし、もう一方をリビルドしないでおくとその違いが分かると思います。
対して PHP や SSI で include している場合は、 UA からのリクエストがあって初めて recent_entries.html を読み込むため、読み込んでいる元のアーカイブをリビルドしようとしまいと、最新の recent_entries.html を反映します。
また、 MTInclude の場合は recent_entries.html を読み込んだ状態でサーバにファイルを put しますが、 PHP や SSI の場合は、あくまで読み込みの命令が書かれた状態でサーバに put されるため、サーバの容量をあまり圧迫せずに済む、という利点もあります。 例えば、 recent_entries.html が 10KB のサイズで、カテゴリアーカイブが 10 個あり、それぞれの本体が 50KB のサイズだとすると、 MTInclude の場合は合計で ( 50 + 10 ) * 10 = 600KB のサイズとなるのに対し、 PHP や SSI の場合は合計で 50 * 10 + 10 = 510 KB のサイズとなります。
まとめ
- カテゴリアーカイブ内でカテゴリリストを作る場合は MTTopLevelCategories を使う。
- カテゴリアーカイブ内で全体の新着記事リストを作る場合は PHP や SSI が使える環境であればそれで include する。 使えない環境の場合のみ MTInclude を用いる。

