Movable Type 5.0(MT5.0)でアーカイブURLにサブドメインを適用する
Movable Type 5.0(MT5.0)でアーカイブURLにサブドメインを適用する方法です。
まず、「アーカイブをサイトパスとは別のパスで公開する」をチェックします。このときにはサブドメインの設定はできません。
とりあえずアーカイブパスとアーカイブURLの末尾に「archives」など、適当な文字を入力して保存します。何か入力しないと保存できません。
一旦保存したあと、「アーカイブをサイトパスとは別のパスで公開する」をチェックすると、サブドメインの指定が可能になります。
さきほど設定した「archives」を削除して、サブドメインを入力して、「保存」をクリックします。
これで完成です。
MTArchiveList タグブロック内で使えるテンプレートタグ
MTArchiveList タグブロック内で使えるテンプレートタグということで、小ネタを紹介します。
MTArchiveList タグでは、通常、MTArchive系のテンプレートタグが使えますが、type モディファイアでブログ記事やカテゴリを指定した場合、その中に直接 MTEntry系や MTCategory系のファンクションタグが記述できます。
<mt:ArchiveList type="Individual">
<mt:EntryTitle />
</mt:ArchiveList>
<mt:ArchiveList type="Category">
<mt:CategoryLabel />
</mt:ArchiveList>
このサブテンプレートは(テンプレートタグの表記を MT3 のお作法に直しても)MT3.x では正常に動作しなかったので、MT4.x から動作が変わったようです。
以下は既出ですが、次のように書けば MTEntries タグブロック内は処理中のカテゴリに依存します。
<mt:ArchiveList type="Category">
<mt:CategoryLabel />
<mt:Entries>
<mt:EntryTitle />
</mt:Entries>
</mt:ArchiveList>
まとめると、「MTArchiveList タグブロック内はアーカイブテンプレートと同じコンテキストである」ということだと思います(多分)。
予約変数一覧 for Movable Type 4.2
MTIf タグ等でアーカイブ種別を判定するための、Movable Type 4.2 ベータで予め用意された予約変数一覧です。
このエントリーは、MT4.1 用にエントリーした「予約変数一覧 for Movable Type 4.1」を MT4.2 ベータ版の内容に書き換えたものです。赤字は 4.1 から削除された変数、青字は追加された変数です。
これらは lib/MT/WeblogPublisher.pm と lib/MT/ArchiveType 配下に記載されているものを抜粋して、下記の表にまとめました(使用方法は後述)。
| Y | M | W | D | C | C | A | A | I | P | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Y | M | W | D | Y | M | W | D | |||||||||
| archive_template | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| datebased_archive | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||
| archive_listing | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
| datebased_only_archive | ○ | ○ | ○ | ○ | ||||||||||||
| category_archive | ○ | ○ | ○ | ○ | ○ | |||||||||||
| author_archive | ○ | ○ | ○ | ○ | ○ | |||||||||||
| entry_archive feedback_template | ○ | ○ | ||||||||||||||
| module_category-monthly_archives | ○ | |||||||||||||||
| module_category_archives | ○ | |||||||||||||||
| module_author-monthly_archives | ○ | ○ | ||||||||||||||
| datebased_yearly_archive module_yearly_archives | ○ | |||||||||||||||
| datebased_monthly_archive | ○ | |||||||||||||||
| datebased_weekly_archive | ○ | |||||||||||||||
| datebased_daily_archive | ○ | |||||||||||||||
| category_yearly_archive | ○ | |||||||||||||||
| category_monthly_archive | ○ | |||||||||||||||
| category_weekly_archive | ○ | |||||||||||||||
| category_daily_archive | ○ | |||||||||||||||
| author_yearly_archive | ○ | |||||||||||||||
| author_monthly_archive | ○ | |||||||||||||||
| author_weekly_archive | ○ | |||||||||||||||
| author_daily_archive | ○ | |||||||||||||||
| entry_template | ○ | |||||||||||||||
| page_archive page_template | ○ | |||||||||||||||
一番上にある略号の意味は次の通りです。
- Y:年別アーカイブ
- M:月別アーカイブ
- W:週別アーカイブ
- D:日別アーカイブ
- C:カテゴリーアーカイブ
- A:ユーザーアーカイブ
- I:ブログ記事アーカイブ
- P:ウェブページアーカイブ
カテゴリーアーカイブとユーザーアーカイブは、年別・月別・週別・日別との組み合わせもあります。
○印がついているのが、そのアーカイブを表示する時に、変数に "1" が設定されていることを示しています。●はデフォルトテンプレートで、テンプレート上に MTSetVar タグで設定されているものを示しています。
例えば、アーカイブ種別が「年別・月別・週別・日別」であることを判定したい場合は、
<MTIf name="datebased_only_archive">
:
</MTIf>
とテンプレート(またはテンプレートモジュール)に書きます。
このタグが書かれたテンプレートやテンプレートモジュールが「年別・月別・週別・日別」として実行される場合、MTIf タグのブロック内部が実行されます。
アーカイブ種別が「ブログ記事・ウェブページ」であることを判定したい場合は
<MTIf name="feedback_template">
:
</MTIf>
と書きます。このタグが書かれたテンプレートやテンプレートモジュールが「ブログ記事・ウェブページ」として実行される場合、MTIf タグのブロック内部が実行されます。
これらを利用すれば、独自の変数を用意する必要はありません。
予約変数一覧 for Movable Type 4.1
MTIf タグ等でアーカイブ種別を判定するための、Movable Type 4.1 で予め用意された予約変数一覧です。
このエントリーは、MT4.0x 用にエントリーした「予約変数一覧 for Movable Type 4(その1)」を MT4.1 ベータ版の内容に書き換えたものです。赤字は 4.0x から削除された変数、青字は追加された変数です。
archive_listing が新たに追加され、カテゴリーアーカイブとユーザーアーカイブがその対象として追加されています。つまりリスト系のアーカイブがこの変数で判断できます。
これらは lib/MT/WeblogPublisher.pm に記載されているもので、抜粋したものを下記の表にまとめました(使用方法は後述)。
記載に誤りがあったため、マトリクスを修正しました。
修正後(これが正解です)
| Y | M | W | D | C | C | A | A | I | P | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Y | M | W | D | Y | M | W | D | |||||||||
| archive_template main_template | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| datebased_archive | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||
| archive_listing | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
| datebased_only_archive | ○ | ○ | ○ | ○ | ||||||||||||
| category_archive | ○ | ○ | ○ | ○ | ○ | |||||||||||
| author_archive | ○ | ○ | ○ | ○ | ○ | |||||||||||
| entry_archive feedback_template | ○ | ○ | ||||||||||||||
module_category-monthly_archives | ○ | ○ | ||||||||||||||
module_author-monthly_archives | ○ | ○ | ||||||||||||||
| datebased_yearly_archive module_yearly_archives | ○ | |||||||||||||||
| datebased_monthly_archive | ○ | |||||||||||||||
| datebased_weekly_archive | ○ | |||||||||||||||
| datebased_daily_archive | ○ | |||||||||||||||
| category_yearly_archive | ○ | |||||||||||||||
| category_monthly_archive | ○ | |||||||||||||||
| category_weekly_archive | ○ | |||||||||||||||
| category_daily_archive | ○ | |||||||||||||||
| author_yearly_archive | ○ | |||||||||||||||
| author_monthly_archive | ○ | |||||||||||||||
| author_weekly_archive | ○ | |||||||||||||||
| author_daily_archive | ○ | |||||||||||||||
| entry_template | ○ | |||||||||||||||
| page_archive page_template | ○ | |||||||||||||||
修正前(一部誤りがあります)
| Y | M | W | D | C | C | A | A | I | P | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Y | M | W | D | Y | M | W | D | |||||||||
| archive_template main_template | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
archive_listing | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
| datebased_only_archive | ○ | ○ | ○ | ○ | ||||||||||||
| category_archive | ○ | |||||||||||||||
| author_archive | ○ | |||||||||||||||
feedback_template | ○ | ○ | ||||||||||||||
module_category-monthly_archives | ○ | ○ | ||||||||||||||
module_author-monthly_archives | ○ | ○ | ||||||||||||||
| datebased_yearly_archive module_yearly_archives | ○ | |||||||||||||||
| datebased_monthly_archive | ○ | |||||||||||||||
| datebased_weekly_archive | ○ | |||||||||||||||
| datebased_daily_archive | ○ | |||||||||||||||
| category_yearly_archive | ○ | |||||||||||||||
| category_monthly_archive | ○ | |||||||||||||||
| category_weekly_archive | ○ | |||||||||||||||
| category_daily_archive | ○ | |||||||||||||||
| author_yearly_archive | ○ | |||||||||||||||
| author_monthly_archive | ○ | |||||||||||||||
| author_weekly_archive | ○ | |||||||||||||||
| author_daily_archive | ○ | |||||||||||||||
| entry_template | ○ | |||||||||||||||
| page_archive page_template | ○ | |||||||||||||||
一番上にある略号の意味は次の通りです。
- Y:年別アーカイブ
- M:月別アーカイブ
- W:週別アーカイブ
- D:日別アーカイブ
- C:カテゴリーアーカイブ
- A:ユーザーアーカイブ
- I:ブログ記事アーカイブ
- P:ウェブページアーカイブ
カテゴリーアーカイブとユーザーアーカイブは、年別・月別・週別・日別との組み合わせもあります。
○印がついているのが、そのアーカイブを表示する時に、変数に "1" が設定されていることを示しています。●はデフォルトテンプレートで、テンプレート上に MTSetVar タグで設定されているものを示しています。
例えば、アーカイブ種別が「年別・月別・週別・日別」であることを判定したい場合は、
<MTIf name="datebased_only_archive">
:
</MTIf>
とテンプレート(またはテンプレートモジュール)に書きます。
このタグが書かれたテンプレートやテンプレートモジュールが「年別・月別・週別・日別」として実行される場合、MTIf タグのブロック内部が実行されます。
アーカイブ種別が「ブログ記事・ウェブページ」であることを判定したい場合は
<MTIf name="feedback_template">
:
</MTIf>
と書きます。このタグが書かれたテンプレートやテンプレートモジュールが「ブログ記事・ウェブページ」として実行される場合、MTIf タグのブロック内部が実行されます。
これらを利用すれば、独自の変数を用意する必要はありません。
2008.02.25
認識に誤りがあったため、マトリクスを修正しました。
アーカイブページのリストの表示内容が異なる理由
「サイドバーの表示をメインページと同じにする」の続きです。
前述のエントリーでは、サイドバーにある各メニューの MTIf タグを外す方法を記しましたが、これだけでは全てのページでサイドバーが同じ表示にはなりません。具体的には、「最近のエントリー」「最近のコメント」「最近のトラックバック」の3つのリストの表示が、アーカイブによって異なります。
理由は、リスト表示に使われるテンプレートタグ(MTEntries 等)がアーカイブの種類に依存した振る舞いをしているためです。全てが依存している訳ではありませんので、具体的な結果については後述します。
これは不具合ではなく、Movable Type の仕様と思われますが、見落としていなければMovable Type ドキュメントには明示的な記述はありません。したがってこれらのリスト類がどのように表示されるか、実際に設定してみないと分からない訳です。
ということで、このエントリーでは、メインページに設定しているリストを各アーカイブページに設定した場合の結果と、それらを回避する方法について記します。
1.「最近のエントリー」「最近のコメント」「最近のトラックバック」のアーカイブページの表示結果
公開テンプレートを例に、メインページに設定してある「最近のエントリー」「最近のコメント」「最近のトラックバック」と同じMTタグを各アーカイブページに設定した場合の表示がどのようになるかを、下記の一覧にまとめました。
| 最近の エントリー | 最近の コメント | 最近の トラックバック | |
|---|---|---|---|
| カテゴリー・アーカイブ | 該当カテゴリーのエントリー一覧 | [MTEntries recently_commented_on指定] 該当カテゴリーの全エントリーのコメントをMTCommentsのlastn分表示 [MTEntries lastn指定] コメントのないエントリー含めlastn分表示 | 表示されない |
| 月別アーカイブ | 該当月のエントリー一覧 | [MTEntries recently_commented_on指定] 該当月の全エントリー・コメントをMTCommentsのlastn分表示 [MTEntries lastn指定] 該当月のコメントのないエントリー含めlastn分表示 | メインページと同様 |
| ブログ記事アーカイブ | メインページと同様 | メインページと同様 | 該当エントリーのトラックバック一覧 |
ちょっと分かりにくいですが、メインページと同じ表示になるのは、
- 月別アーカイブ:「最近のトラックバック」
- ブログ記事アーカイブ:「最近のエントリー」「最近のコメント」
の3パターンのみです。
2.考察
それぞれのリストが、各アーカイブでどのように振舞っているかをまとめました。
最近のエントリー・最近のコメント
「ブログ記事リスト」として再構築される場合は、テンプレートの種別に依存した表示になります。ブログ記事やウェブページといった単一ページではテンプレート種別に依存しません。
最近のトラックバック
そもそも Movable Type におけるトラックバックは、「ブログ記事」あるいは「カテゴリー」に対応した情報です。したがって、ブログ記事リスト・カテゴリーアーカイブとして再構築される場合は、テンプレート種別に依存した表示が自然です。
月別アーカイブでメインページと同じ表示になるのは、トラックバックが「日付」というアーカイブ種別に依存しない性質の情報だからです。
なお、上記の表では、カテゴリーアーカイブでは「最近のトラックバックが表示されない」と記しましたが、実はカテゴリー単位にトラックバック設定があり、ブログ管理画面より「一覧」→「カテゴリ」→「任意のカテゴリ名」で、トラックバック受信許可の項目があります。

ここに表示されたトラックバックURLにトラックバックを送信すれば、カテゴリーアーカイブに紐づけられた「最近のトラックバック」が表示されます。ブログ管理画面の「トラックバック一覧」にも受信件数が表示されます(下)。

3.アーカイブページで正常に表示する方法
次にアーカイブページで「最近のエントリー」「最近のコメント」「最近のトラックバック」を表示する方法を記します。
3.1 プラグインを利用する
メインページと同じ情報をアーカイブページに表示するには、indexcontext プラグインがお勧めです。
また、MTCollate プラグインを利用すればカテゴリー・アーカイブ/月別アーカイブで正常にすることができます。
Recents プラグインを利用する方法もあります。このプラグインを利用する場合は、MTCommentsRecent タグに mode="force" を付与することを忘れないでください。
3.2 モジュール化する
リスト自体をモジュール化(部品化)します。具体的には、インデックステンプレートとしてリストを作成・再構築し、その情報をインクルードすれば、問題を解消することができます。
ここで述べる「モジュール化」は、ブログ管理画面の「デザイン」→「テンプレート」→「テンプレートモジュール」とは異なりますのでご注意ください。
モジュール化には、
がありますが、個人的には「Ajax モジュール化」をお勧めします。
4.まとめ
メインページと同じ表示を行う場合、個人的には3.2項のモジュール化による表示を推奨します。
理由は、ページ数が増大しても再構築のパフォーマンスがほとんど変わらないためです。モジュール化しない場合、「最近のエントリー」「最近のコメント」「最近のトラックバック」がアーカイブページ分再構築されますが、インデックステンプレートでモジュール化すれば、アーカイブページが増えても、常に3ファイルしか再構築されずにすみます。
「カテゴリーリスト」や「月別アーカイブリスト」、また再構築のパフォーマンスの問題上、メインページでしか表示が推奨されていない「タグクラウド」等、同様の手法でモジュール化するとさらに良いでしょう。
このエントリーは「アーカイブページに「最近のコメント」「最近のトラックバック」を表示する」をリファクタリングしたものです。
サイドバーの表示をメインページと同じにする
Movable Type 4 で、サイドバーの表示をメインページと同じにするカスタマイズです。
複数の方から「各ページのサイドバーの表示をメインページを同じしたいのですが」という質問を頂きましたので、このエントリーで紹介致します。
ここでは当ブログの配布テンプレート「Movable Type テンプレート」を例に説明しますが、デフォルトテンプレートでも同様のカスタマイズが可能です。
なお、このエントリーのカスタマイズを行うだけではメインページと全く同じ表示にならないのですが、そのことについては次回のエントリーで解説します。
1.ページによってサイドバーの表示内容が異なる仕組み
ページによってサイドバーの表示内容が異なるのは、サイドバーの各リストを MTIf タグで括り、表示するページを振り分けているためです。MTIf は Movable Type 4 で新たに追加されたテンプレートタグで、ある値を判定することで処理を振り分ける、という機能をもっています。
例えば、タグクラウドがメインページでしか表示されないのは、下のように MTIf タグで全体を括っています。
<MTIf name="main_index">
<dt class="sidetitle">
Tag Clouds
</dt>
<dd class="side">
<ul id="tags">
<MTTags>
<li class="module-list-item taglevel<$MTTagRank$>">
<a href="<$MTTagSearchLink$>"><$MTTagName$></a>
</li>
</MTTags>
</ul>
</dd>
</MTIf>
そして、MTIf タグの name 属性に記述された main_index という変数の値が "1" の場合にのみ、MTIf タグブロック内部が実行(=再構築対象)されます。
main_index という変数は、メインインデックスを再構築する時だけ "1" になる仕組みになっています。
また、月別アーカイブリストは、
<MTIf name="module_monthly_archives">
<MTIfArchiveTypeEnabled archive_type="Monthly">
<dt class="sidetitle">
Monthly Archives
</dt>
<dd class="side">
<ul>
<MTArchiveList archive_type="Monthly">
<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]</li>
</MTArchiveList>
</ul>
</dd>
</MTIfArchiveTypeEnabled>
</MTIf>
と、MTIf タグの name 属性に module_monthly_archives という変数名を用いています。そして月別アーカイブの再構築時だけ module_monthly_archives の値が "1" になり、MTIf タグブロック内が再構築対象となります。
2.メインページと同じ表示にする方法
方法は、各リストを括っているMTIf タグを外すだけです。ただし、「最近のエントリー」については冒頭に記した通り、MTIf タグを外しただけではメインページと同じ表示にならないので、その点は予めご了承ください。
以下、リスト別に示します。赤色部分を削除してください。
最近のエントリー
<MTIf name="module_recent_entries">
<dt class="sidetitle">
Recent Entries
</dt>
<dd class="side">
<ul>
<MTEntries lastn="10">
<li><a href="<$MTEntryPermalink$>" title="e<$MTEntryID$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ul>
</dd>
</MTIf>
タグクラウド
<MTIf name="main_index">
<dt class="sidetitle">
Tag Clouds
</dt>
<dd class="side">
<ul id="tags">
<MTTags>
<li class="module-list-item taglevel<$MTTagRank$>">
<a href="<$MTTagSearchLink$>"><$MTTagName$></a>
</li>
</MTTags>
</ul>
</dd>
</MTIf>
カテゴリーリスト
<MTIf name="module_category_archives">
<MTIfArchiveTypeEnabled archive_type="Category">
<dt class="sidetitle">
Categories
</dt>
<dd class="side">
<div id="categories">
<MTTopLevelCategories>
<MTSubCatIsFirst><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>]
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse max_depth="3">
</li>
<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</dd>
</MTIfArchiveTypeEnabled>
</MTIf>
月別アーカイブリスト
<MTIf name="module_monthly_archives">
<MTIfArchiveTypeEnabled archive_type="Monthly">
<dt class="sidetitle">
Monthly Archives
</dt>
<dd class="side">
<ul>
<MTArchiveList archive_type="Monthly">
<li><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a> [<$MTArchiveCount$>]</li>
</MTArchiveList>
</ul>
</dd>
</MTIfArchiveTypeEnabled>
</MTIf>
3.注意事項
タグクラウドは再構築のパフォーマンスに影響があるため、他のアーカイブで表示させない(MTIf タグを外さない)ことをお勧めします。
表示させたい場合は Ajax モジュール化を行ないましょう。
4.サイドバーの MTIf タグに設定されている変数名
参考までに、デフォルトテンプレート(3 カラム)で、各リストの MTIf タグに設定されている変数名をまとめました(配布テンプレートも基本的にこの仕組みにしたがっています)。
| リスト名 | 変数名 |
|---|---|
| タグクラウド | main_index |
| ユーザーアーカイブリスト | module_author_archives |
| 月別アーカイブリスト | module_monthly_archives |
| 月別カテゴリーアーカイブリスト | module_category-monthly_archives |
| 月別ユーザアーカイブリスト | module_author-monthly_archives |
| 最近のエントリー | module_recent_entries |
| アイテムリスト | main_index |
| サブカテゴリーリスト | module_category_archives |
上記の各変数名がどのページで "1" になるかについては「予約変数一覧 for Movable Type 4(その1)」を参考にしてください。
なお、
- main_index
- module_recent_entries
の2つの変数については、どちらもメインページのみで "1" となります。
予約変数一覧 for Movable Type 4(その2)
MTIf タグ等でアーカイブ種別を判定するための、Movable Type 4 で予め用意された予約変数一覧です。「予約変数一覧 for Movable Type 4(その1)」でまとめたものは変数に"1"が設定されているものですが、今回は、
archive_class
という変数に設定されている文字列をまとめました。
大体お分かりと思いますが、この変数はアーカイブ種別を判定するためのものです。
前回同様、lib/MT/WeblogPublisher.pm に記載されています(使用方法は後述)。
| アーカイブ種別 | 変数名 |
|---|---|
| 年別 | datebased-yearly-archive |
| 月別 | datebased-monthly-archive |
| 週別 | datebased-weekly-archive |
| 日別 | datebased-daily-archive |
| ブログ記事 | entry-archive |
| ウェブページ | page-archive |
| カテゴリ | category-archive |
| 年別カテゴリ | category-yearly-archive |
| 月別カテゴリ | category-monthly-archive |
| 週別カテゴリ | category-weekly-archive |
| 日別カテゴリ | category-daily-archiv |
| ユーザー | author-archive |
| 年別ユーザー | author-yearly-archive |
| 月別ユーザー | author-monthly-archive |
| 週別ユーザー | author-weekly-archive |
| 日別ユーザー | author-daily-archive |
例えば、アーカイブ種別が「月別カテゴリ」であることを判定したい場合は、
<MTIf name="archive_class" eq="category-monthly-archive">
:
</MTIf>
とテンプレート(またはテンプレートモジュール)に書きます。
このタグが書かれたテンプレートやテンプレートモジュールが「月別カテゴリ」として実行される場合、MTIf タグのブロック内部が実行されます。
アーカイブ種別が「ブログ記事」であることを判定したい場合は
<MTIf name="archive_class" eq="entry-archive">
:
</MTIf>
と書きます。このタグが書かれたテンプレートやテンプレートモジュールが「ブログ記事」として実行される場合、MTIf タグのブロック内部が実行されます。
これらを利用すれば、独自の変数を用意する必要はありません。
MTArchiveType との違い
Movable Type では MTArchiveType タグが用意されているので、これを使って判定することも可能ですが、実装がやや面倒です。
例えば、アーカイブ種別が「ブログ記事」であることを判定したい場合は、
<MTSetVarBlock name="archive_type"><$MTArchiveType$></MTSetVarBlock>
<MTIf name="archive_type" eq="Individual">
:
</MTIf>
となります。MTSetVarBlock タグで値を任意の変数 archive_type に設定する分が余分に必要です。
変則的な判定方法
like 属性を用いて、各アーカイブ(日付・カテゴリ・ユーザー)の月別アーカイブだけを取得するには次のように記述します。
<MTIf name="archive_class" like="monthly">
:
</MTIf>
予約変数一覧 for Movable Type 4(その1)
MTIf タグ等でアーカイブ種別を判定するための、Movable Type 4 で予め用意された予約変数一覧です。
これらは lib/MT/WeblogPublisher.pm に記載されているもので、抜粋したものを下記の表にまとめました(使用方法は後述)。
| Y | M | W | D | C | C | A | A | I | P | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Y | M | W | D | Y | M | W | D | |||||||||
| archive_template main_template | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| datebased_archive | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||
| datebased_only_archive | ○ | ○ | ○ | ○ | ||||||||||||
| category_archive | ○ | ○ | ○ | ○ | ○ | |||||||||||
| author_archive | ○ | ○ | ○ | ○ | ○ | |||||||||||
| entry_archive feedback_template | ○ | ○ | ||||||||||||||
| module_category_archives module_category-monthly_archives | ○ | ○ | ||||||||||||||
| module_author_archives module_author-monthly_archives | ○ | ○ | ||||||||||||||
| datebased_yearly_archive module_yearly_archives | ○ | |||||||||||||||
| datebased_monthly_archive module_monthly_archives | ○ | |||||||||||||||
| datebased_weekly_archive | ○ | |||||||||||||||
| datebased_daily_archive | ○ | |||||||||||||||
| category_yearly_archive | ○ | |||||||||||||||
| category_monthly_archive | ○ | |||||||||||||||
| category_weekly_archive | ○ | |||||||||||||||
| category_daily_archive | ○ | |||||||||||||||
| author_yearly_archive | ○ | |||||||||||||||
| author_monthly_archive | ○ | |||||||||||||||
| author_weekly_archive | ○ | |||||||||||||||
| author_daily_archive | ○ | |||||||||||||||
| entry_template | ○ | |||||||||||||||
| page_archive page_template | ○ | |||||||||||||||
一番上にある略号の意味は次の通りです。
- Y:年別アーカイブ
- M:月別アーカイブ
- W:週別アーカイブ
- D:日別アーカイブ
- C:カテゴリーアーカイブ
- A:ユーザーアーカイブ
- I:ブログ記事アーカイブ
- P:ウェブページアーカイブ
カテゴリーアーカイブとユーザーアーカイブは、年別・月別・週別・日別との組み合わせもあります。
○印がついているのが、そのアーカイブを表示する時に、変数に "1" が設定されていることを示しています。●はデフォルトテンプレートで、テンプレート上に MTSetVar タグで設定されているものを示しています。
例えば、アーカイブ種別が「年別・月別・週別・日別」であることを判定したい場合は、
<MTIf name="datebased_only_archive">
:
</MTIf>
とテンプレート(またはテンプレートモジュール)に書きます。
このタグが書かれたテンプレートやテンプレートモジュールが「年別・月別・週別・日別」として実行される場合、MTIf タグのブロック内部が実行されます。
アーカイブ種別が「ブログ記事・ウェブページ」であることを判定したい場合は
<MTIf name="entry_archive">
:
</MTIf>
または
<MTIf name="feedback_template">
:
</MTIf>
と書きます。このタグが書かれたテンプレートやテンプレートモジュールが「ブログ記事・ウェブページ」として実行される場合、MTIf タグのブロック内部が実行されます。
これらを利用すれば、独自の変数を用意する必要はありません。
アーカイブのブログ記事一覧をサイドバーに表示する
「ブログ記事リスト」テンプレートを利用した各アーカイブページで MTEntries タグを利用すると、アーカイブの種類に該当するブログ記事(エントリー)のみが表示されます。例えば2007年9月のアーカイブでは、その月に投稿したブログ記事のみが表示されます。
これを利用して、アーカイブのブログ記事一覧をサイドバーに表示するカスタマイズを紹介します。このカスタマイズのポイントは、リストのタイトル表示をアーカイブの種類に合わせて切り替えるところです。
ここでは MT4 の配布テンプレートを例に説明しますが、MTタグ部分の構造は他のテンプレートでも共通に使えます。
1.月別アーカイブリストのブログ記事一覧を表示する
「デザイン」→「テンプレート」→「テンプレートモジュール」→「サイドバー(または「サイドバー2」)」に下記のタグを追加します。
<MTIf name="datebased_only_archive">
<MTIfArchiveTypeEnabled archive_type="Monthly">
<dt class="sidetitle">
List of "<$MTArchiveDate format="%B %Y"$>"
</dt>
<dd class="side">
<ul>
<MTEntries>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ul>
</dd>
</MTIfArchiveTypeEnabled>
</MTIf>
リストタイトル部分の MTArchiveDate に format 属性を加えて、MTArchiveDate から必要な情報(年月)のみを抽出しています。
また、MTIf タグと MTIfArchiveTypeEnabled タグで全体を括り、月別アーカイブかつ、月別アーカイブが利用可能な場合のみ表示するように制御しています。
2.カテゴリーアーカイブリストのブログ記事一覧を表示する
「デザイン」→「テンプレート」→「テンプレートモジュール」→「サイドバー(または「サイドバー2」)」に下記のタグを追加します。
<MTIf name="category_archive">
<MTIfArchiveTypeEnabled archive_type="Category">
<dt class="sidetitle">
List of "<$MTArchiveTitle$>"
</dt>
<dd class="side">
<ul>
<MTEntries>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ul>
</dd>
</MTIfArchiveTypeEnabled>
</MTIf>
カテゴリーアーカイブのリストタイトルは MTArchiveDate をそのまま表示させています。
こちらも、MTIf タグと MTIfArchiveTypeEnabled タグで全体を括り、カテゴリーアーカイブかつ、カテゴリーアーカイブが利用可能な場合のみ表示するように制御しています。
なお、カテゴリー配下のサブカテゴリーを含めたい場合は、下のように MTEntries を MTEntriesWithSubCategories にします。
<MTIf name="category_archive">
<MTIfArchiveTypeEnabled archive_type="Category">
<dt class="sidetitle">
List of "<$MTArchiveTitle$>"
</dt>
<dd class="side">
<ul>
<MTEntriesWithSubCategories>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntriesWithSubCategories>
</ul>
</dd>
</MTIfArchiveTypeEnabled>
</MTIf>
ここでは月別アーカイブとカテゴリーアーカイブをサンプルにしましたが、他のアーカイブでも色々試してみてください。
2007.11.22
各サンプルの MTIf タグに誤りがありました(メインページにも適用される変数を使用していました)ので修正致しました。
Movable Type 4 のアーカイブリスト表示の仕組みを探る
デフォルトテンプレートのサイドバーにある、アーカイブリスト表示について解説します。
当サイトで現在配布中のテンプレートもこれとほぼ同じ構成で、MTIf の部分だけを抽出すると、概ね下記のようになっていますので参考にしてください。*1
1.アーカイブリスト表示用のテンプレートタグ
「デザイン」→「テンプレート」→「テンプレートモジュール」→「サイドバー(3カラム)(または2カラム)」の中に下記のようなテンプレートタグがあります。これがアーカイブリスト表示用のテンプレートタグです。
<MTIf name="module_author_archives">
:
[ユーザー別アーカイブリスト]
:
</MTIf>
<MTIf name="module_monthly_archives">
:
[月別アーカイブリスト]
:
</MTIf>
<MTIf name="module_category-monthly_archives">
:
[月別カテゴリアーカイブリスト]
:
</MTIf>
<MTIf name="module_author-monthly_archives">
:
[ユーザー月別アーカイブリスト]
:
</MTIf>
<MTIf name="module_category_archives">
:
[カテゴリアーカイブリスト]
:
</MTIf>
デフォルトでは5種類のアーカイブリストが用意されており、すべて青色の MTIf タグで括られています。
メインページでは
- 月別アーカイブリスト
- ユーザー別アーカイブリスト
- カテゴリアーカイブリスト
が表示されるようになっています。各アーカイブページでは、アーカイブの内容にそったリストが表示されます(その仕組みは後述)。
アーカイブリストが表示されるためには、上の赤色で示した、MTIf タグにある、各 name 属性の値が "1" であることが条件になります。
例えば、月別アーカイブが表示されるためには、module_monthly_archives に "1" が設定されている必要があります。
この MTIf タグの name 属性が表示を制御するポイントとなりますので、次に、各 name 属性の値をどこで "1" に設定しているかについて解説します。
2.メインページで表示される仕組み
メインページテンプレートの先頭に下のタグが記述されています。
<MTSetVar name="module_category_archives" value="1">
<MTSetVar name="module_author_archives" value="1">
<MTSetVar name="module_monthly_archives" value="1">
つまり、MTSetVar タグで name 属性の値に "1" が設定され、メインページのサイドバーには、前述の通り、カテゴリアーカイブリスト・ユーザー別アーカイブリスト・月別アーカイブリストが表示される、という訳です。
ただし、厳密には各リストは MTIfArchiveTypeEnabled タグでも括られています(下の青色部分)。
<MTIf name="module_author_archives">
<MTIfArchiveTypeEnabled archive_type="Author">
:
[ユーザー別アーカイブリスト]
:
</MTIfArchiveTypeEnabled>
</MTIf>
<MTIf name="module_monthly_archives">
<MTIfArchiveTypeEnabled archive_type="Monthly">
:
[月別アーカイブリスト]
:
</MTIfArchiveTypeEnabled>
</MTIf>
<MTIf name="module_category-monthly_archives">
<MTIfArchiveTypeEnabled archive_type="Category-Monthly">
:
[月別カテゴリアーカイブリスト]
:
</MTIfArchiveTypeEnabled>
</MTIf>
<MTIf name="module_author-monthly_archives">
<MTIfArchiveTypeEnabled archive_type="Author-Monthly">
:
[ユーザー月別アーカイブリスト]
:
</MTIfArchiveTypeEnabled>
</MTIf>
<MTIf name="module_category_archives">
<MTIfArchiveTypeEnabled archive_type="Category">
:
[カテゴリアーカイブリスト]
:
</MTIfArchiveTypeEnabled>
</MTIf>
MTIfArchiveTypeEnabled タグの中が実行されるためには、赤色で示した「アーカイブ種類(=アーカイブマッピング)」が存在する必要があります。存在しなければ、リストは表示されません。
デフォルトテンプレートでは「ユーザー別アーカイブ」のアーカイブマッピングは設定されていないので、MTSetVar タグがあるにもかかわらずメインページに表示されないのは、そのためです。
3.アーカイブページで表示される仕組み
メインページについてはテンプレート編集画面で MTSetVar タグで name 属性が明示されていますが、各アーカイブテンプレート、例えば「ブログ記事リスト」には、
module_author_archives
module_monthly_archives
module_category-monthly_archives
module_author-monthly_archives
module_category_archives
という name 属性値は見当たりません。
実は、これらの値はシステムで事前に設定されており、各アーカイブに対応する name 属性に "1" が設定されているのです。
ソースコードが読める方は lib/MT/WeblogPublisher.pm の core_archive_types というサブルーチンを見ればお分かりになると思います。
下は、lib/MT/WeblogPublisher.pm より月別アーカイブ部分を抜粋したものです。青字部分に module_monthly_archives が設定されているのが何となくお分かりになると思います。
sub core_archive_types {
return {
:
(中略)
:
'Monthly' => ArchiveType(
name => 'Monthly',
archive_label => \&monthly_archive_label,
archive_file => \&monthly_archive_file,
archive_title => \&monthly_archive_title,
date_range => \&monthly_date_range,
archive_group_iter => \&monthly_group_iter,
archive_group_entries => \&monthly_group_entries,
archive_entries_count => \&monthly_entries_count,
dynamic_template => 'archives/<$MTArchiveDate format="%Y%m"$>',
default_archive_templates => [
ArchiveFileTemplate(
label => MT->translate('yyyy/mm/index.html'),
template => '%y/%m/%i',
default => 1
),
],
dynamic_support => 1,
date_based => 1,
template_params => {
datebased_only_archive => 1,
datebased_monthly_archive => 1,
module_monthly_archives => 1,
main_template => 1,
archive_template => 1,
archive_class => "datebased-monthly-archive",
},
),
:
(中略)
:
};
}
他のアーカイブも同様にシステムで設定された値を使用しています。
アーカイブページ右上に表示される「このアーカイブについて」も、同じ仕組みで制御されています。

4.すべてのアーカイブページで同じアーカイブリストを表示するには
1項で示した、各アーカイブリストの一番外側にある MTIf タグを削除してください。
ただしアーカイブによってはメインページと表示が異なる可能性があります。その場合は、
で対応してみてください。
拙著「Movable Type WEBデザインの新しいルール」の配布テンプレートではこのタグを省略しています。
アーカイブページに「最近のコメント」「最近のトラックバック」を表示する
「カテゴリー・アーカイブページや月別アーカイブページで『最近のコメント』『最近のトラックバック』が正常に表示されません」という質問を時々頂くことがあります。
質問の通り、例えばこのサイトのトップページにある「最近のエントリー」「最近のコメント」「最近のトラックバック」のテンプレートをそのままアーカイブページに貼り付けても、ユーザーが期待する表示にはなりません。これはリスト表示に使われるMTタグ(MTEntries等)がアーカイブの属性に依存した振る舞いをするのが原因と思われます(下記の調査ではそうでもない結果になっていますが)。
これは不具合ではなく、Movable Type の仕様、あるいは制限事項と思って頂いて良いと思いますが、見落としていなければユーザーマニュアルには明示的な記述はありません。したがってこれらのリスト類がどのように表示されるか、実際に設定してみないと分からない訳です。
ということで、トップページに設定しているリストを各アーカイブページに設定した場合の結果と、それらを回避する方法について記します。
1.MTタグをアーカイブテンプレートに設定した場合の結果
公開テンプレートを例に、メインページに設定してある「最近のエントリー」「最近のコメント」「最近のトラックバック」と同じMTタグを各アーカイブページに設定した場合の表示がどのようになるかを、下記の一覧にまとめました。
| カテゴリー・アーカイブ | 月別アーカイブ | エントリー・アーカイブ | |
|---|---|---|---|
| 最近の エントリー |
該当カテゴリーのエントリー一覧 | 該当月のエントリー一覧 | トップページと同様 |
| 最近の コメント |
[MTEntries recently_commented_on指定] 該当カテゴリーの全エントリーのコメントをMTCommentsのlastn分表示 [MTEntries lastn指定] コメントのないエントリー含めlastn分表示 | [MTEntries recently_commented_on指定] 該当月の全エントリー・コメントをMTCommentsのlastn分表示 [MTEntries lastn指定] 該当月のコメントのないエントリー含めlastn分表示 | トップページと同様 |
| 最近の トラックバック |
表示されない | トップページと同様 | 該当エントリーのトラックバック一覧 |
2.アーカイブページで正常に表示する方法
次にアーカイブページで「最近のエントリー」「最近のコメント」「最近のトラックバック」を表示する方法を記します。
2.1 プラグインを利用する
MTCollate プラグインを利用すればカテゴリー・アーカイブ/月別アーカイブで正常に表示されるようです。設定方法はMTCollate を使って「最近のコメント」を表示するに記しています。ただしエントリー・アーカイブでは該当エントリーだけが対象になるようです。
もうひとつは Recents プラグインを利用します。
The blog of H.Fujimoto:最近のコメント/トラックバックをエントリーとともに表示するプラグイン
本プラグインであれば各アーカイブページで正常に動作します。いずれも MTCommentsRecent タグに mode="force" を付与することを忘れないでください。
2.2 モジュール化する
リスト表示用タグをアーカイブテンプレートに直接貼り付けると冒頭の問題が発生しますが、リスト自体を独立したモジュール(部品)として登録すれば解消されます。
以下、インデックステンプレートに「最近のコメント」を登録して、それをアーカイブページから読み込む方法を紹介します。
2.2.1 モジュール用テンプレートの作成
管理画面の「テンプレート」をクリック→右上の「テンプレートを新規作成」をクリック。次画面で下記を設定します。
- テンプレート名:最近のコメント
- 出力ファイル名:recentComments.html
- インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する:チェック
- テンプレートの内容:下記(ここでは公開テンプレートのタグを流用しています)
<div class="sidetitle">
Recent Comments
</div>
<div class="side">
<MTEntries recently_commented_on="5">
<a href="<$MTEntryLink$>"><MTEntryTitle></a>
<br />
<MTComments lastn="5">
└ <a href="<$MTEntryLink$>#c<$MTCommentID$>" title="c<$MTCommentID$>">
<MTCommentAuthor></a> <$MTCommentDate format="%m/%d"$><br />
</MTComments>
</MTEntries>
</div>
設定が完了したら保存・再構築してください。これで「最近のコメント」だけを表示するためのページが index.html と同じディレクトリにできあがります。ファイル名の拡張子は .html にしていますが、.txt 等なんでも結構です。
2.2.2 アーカイブテンプレートの修正
アーカイブテンプレートの編集画面に進み、2.2.1項で作った「最近のコメント」を表示する設定を行います。
A/B/Cのいずれかを選択してください。
- A.MTInclude タグでインクルードする
- B.PHPでインクルードする
- C.JavaScriptでインクルードする
違いは、Aは再構築を契機に「最近のコメント」を取得するのでスタティックページと同じ効果(=次に再構築が実行されるまで最近のコメントが更新されない)ですが設定が手軽に行えます。
Bはページビューを契機に「最近のコメント」取得します。「最近のコメント」はコメントが投稿されるたびに更新されるので、常に最新情報が反映されるというメリットがあります。ただしPHP化する必要がある・PHPがインストールされている必要がある等の条件があります。
CはA・Bの長所をもっています。
A.MTInclude タグを利用する
「最近のコメント」を表示したい場所に下記のタグを追加して、保存・再構築します。
<$MTInclude file="recentComments.html"$>
B.PHPを利用する
「最近のコメント」を表示したい場所に下記のタグを追加して、保存・再構築します。
<? readfile('<$MTBlogURL$>recentComments.html')?>
Bの場合、はタグを記述するテンプレートの拡張子が .php であることが前提となります。また、1行目にXML宣言
<?xml version="1.0" encoding="<$MTPublishCharset$>"?>
が記述されている場合は
<? echo('<?xml version="1.0" encoding="<$MTPublishCharset$>"?>') ?>
に変更してください。さらにアーカイブページのファイル(index.html)が残っていると、リンクをクリックした場合に .html ファイルを優先してアクセスする可能性があるため、全アーカイブページを一旦削除してから再構築されることを推奨します。
C.JavaScript を利用する
手順が前後してすいませんが、2.2.1の内容は下記に変更してください。
- テンプレート名:最近のコメント
- 出力ファイル名:recentComments.js
- インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する:チェック
- テンプレートの内容:下記(ここでは公開テンプレートのタグを流用しています)
document.write('<div class="sidetitle">');
document.write('Recent Comments');
document.write('</div>');
document.write('<div class="side">');
<MTEntries recently_commented_on="5">
document.write('<a href="<$MTEntryLink$>"><MTEntryTitle encode_js="1"></a>');
document.write('<br />');
<MTComments lastn="5">
document.write('└ <a href="<$MTEntryLink$>#c<$MTCommentID$>" title="c<$MTCommentID$>">');
document.write('<MTCommentAuthor encode_js="1"></a> <$MTCommentDate format="%m/%d"$><br />');
</MTComments>
</MTEntries>
document.write('</div>');
そしてアーカイブテンプレートの「最近のコメント」を表示したい場所に下記のタグを追加して、保存・再構築します。
<script type="text/javascript" src="<$MTBlogURL$>recentComments.js"></script>
以上です。
「最近のエントリー」や「最近のトラックバック」も同様の手順で作成すればOKです。
3.まとめ
個人的にはモジュール化による表示を推奨します。理由はリストの修正・管理が容易になり、再構築のパフォーマンスも向上するためです。「最近のエントリー」「最近のコメント」「最近のトラックバック」を全アーカイブページ分生成することと、3ファイルだけを生成することを比較すれば、どちらが速いか感覚的にお分かりになると思います。先のプラグインと組み合わせればさらにきめこまかい表示の設定が可能になります。
トップページ等のインデックステンプレートのリスト類も同様の手法でインクルードすると良いでしょう。
最初の設定がやや手間取るかもしれませんが興味のある方はお試しください。なお当サイトでは全てのリストについてPHPモジュール化を行っています。
