ブログの全ページに最新記事のリストを出力する裏ワザ

Movable Typeで意外に難しいことの1つに、「ブログの全ページに、ブログ全体での最新のブログ記事のリストを出力する」ということがあります。
いくつかの手法がありますが、それらとは異なる裏ワザを見つけたので、紹介します。

この方法を使うと、PHPもプラグインも使わずに、Movable Typeの標準機能だけで、ブログの全ページに最新記事のリストを出力することができます。
ただし、Movable Typeのドキュメントには掲載されていない機能を使いますので、非公式の裏ワザです。
また、ブログの全ページで最新記事リストの部分を再構築する形になりますので、効率が悪いことも頭に入れておいてください。

1.そもそもの問題

ブログでは、サイドバーに「最新の記事のリスト」を出すことが多いです。
ところが、Movable Typeには、「どのページでも最新記事のリストを出力する」というテンプレートタグがありません。

記事の一覧を出力するには、MTEntriesタグを使います。
ただ、このテンプレートタグは、テンプレートによって動作が異なります。
カテゴリアーカイブや月別アーカイブなどのリスト系アーカイブでは、そのアーカイブに属するブログ記事を出力するようになっています。

MTEntriesタグに、「テンプレートの種類に関係なく、ブログ全体での最新記事を出力する」というモディファイアがあれば、問題を解決できます。
しかし、残念ながらそのようなモディファイアはありません。

2.従来の解決法

この問題を解決する方法として、これまででは「最新記事のリストを出力するだけのインデックステンプレートを作り、その再構築結果を各ページにPHPでincludeする」という手法がよく使われています。
また、blog.aklaswad.comで配布されている「IndexContext」というプラグインを使う方法も知られています。

ただ、前者の方法だと、ブログの各ページをPHPとして出力する必要があります。
また、後者の方法ではプラグインが必要です。

しかし、案件によっては、PHPやプラグインを極力使わないようにしたいこともあります。
そうなると、これまでの手法ではお手上げになってしまいます。

3.裏ワザ

Movable TypeのContextHandler.pm(テンプレートタグを処理するモジュール)のソースコードを見ていたときに、MTBlogsタグに「ignore_archive_context」というモディファイアの処理があることを見つけました。
このモディファイアは、IndexContextプラグインと同様に、一時的にコンテキストを外す処理を行うのに使うことができます。

このモディファイアを使って、テンプレートに以下のような部分を入れると、テンプレートに関係なく最新のブログ記事のリストを出力することができます。
MTEntriesタグの「lastn="○○"」には、出力したいブログ記事の件数を書きます。

<mt:BlogID setvar="blog_id">
<mt:Blogs include_blogs="$blog_id" ignore_archive_context="1">
    <mt:Entries include_blogs="$blog_id" lastn="○○">
        個々のブログ記事の情報を出力するテンプレートタグ
    </mt:Entries>
</mt:Blogs>

1行目のMTBlogIDタグで、現在再構築中のブログのIDを変数blog_idに代入します。
そして、2行目のMTBlogsタグで、IDが変数blog_idに等しい(=現在再構築中の)ブログの情報を扱えるようにし、またコンテキストを外します。
この結果、3~5行目のMTEntriesタグでは、テンプレートに関係なく、ブログ全体の最新記事のリストを出力することができるようになります。

MTEntriesタグには「include_blogs="$blog_id"」のモディファイアを入れる必要があるようです。
このモディファイアがないと、カテゴリアーカイブテンプレートの再構築の際にエラーが発生しました。

たとえば、Movable Type付属の「既定のブログ」(MT5では「クラシックブログ」)のテンプレートで、サイドバーに最新記事一覧を出力したいとします。
この場合、以下のようなウィジェットを作り、そのウィジェットをサイドバーに組み込むようにします。

<mt:If tag="BlogEntryCount">
<mt:BlogID setvar="blog_id">
<mt:Blogs include_blogs="$blog_id" ignore_archive_context="1">
    <mt:Entries include_blogs="$blog_id" lastn="10">
        <mt:EntriesHeader>
<div class="widget-recent-entries widget-archives widget">
    <h3 class="widget-header">最近のブログ記事</h3>
    <div class="widget-content">
        <ul>
        </mt:EntriesHeader>
            <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
        <mt:EntriesFooter>
        </ul>
    </div>
</div>
        </mt:EntriesFooter>
    </mt:Entries>
</mt:Blogs>
</mt:If>

なお、ignore_archive_contextモディファイアは、Movable Type 4以降なら使えるはずです。
こちらでは、Movable Type 4.261とMovable Type 5.0β4で動作を確認しました。
また、記事の冒頭でも述べたように、このモディファイアはMovable Typeのドキュメントには記載されていません。