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のドキュメントには記載されていません。




コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。
こんにちは、興味があったので早速試してみたのですが、私の所ではカテゴリアーカイブで以下のようなビルドエラーになってしまいました。
> Can't call method "id" on an undefined value at ../../lib/MT/ArchiveType/Category.pm line 130.
Perl版ダイナミックパブリッシングを利用していますが、そのせいでしょうか?
>fooさん
こんにちは。
こちらでMT5β4でテストした限りでは、Perl版ダイナミックパブリッシングでも、カテゴリアーカイブを問題なく表示することができました。
テンプレートの内容によるのかも知れません。
こんにちは。
私がよく使う手法で、あまりスマートではないですが以下のようにMTArchivesとHashを使えば実現できないでしょうか?
(MT4.261で動作確認しています。)
<$mt:SetVar name="entries_num" value="0"$>
<MTArchives archive_type="Individual">
<MTArchiveList>
<mt:If name="entries_num" lt="5">
<MTSetVarBlock name="entry_body"><li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li></MTSetVarBlock>
<MTSetVarBlock name="entry_date"><$MTEntryDate format="%Y年エ%m年%d日"$><$MTEntryDate format="%k:%I"$></MTSetVarBlock>
<MTSethashVar name="entries_list"><MTSetVar name="$entry_body" value="$entry_date"></MTSethashVar>
<$mt:SetVar name="entries_num" value="1" op="add"$>
</MTComments>
</mt:If>
</MTArchiveList>
</MTArchives>
<mt:If name="entries_num" gt="0">
<ul>
<MTLoop name="entries_list" sort_by="value reverse">
<$MTVar name="__key__"$>
</MTLoop>
</ul>
</mt:If>
>でぷさん
こんにちは。
MTArchiveListタグは盲点でした。
ただ、こちらで調べてみたところ、ハッシュを使わずにもっと簡単に書けることが分かりました。
明日の記事のネタにしたいと思います。
>壱さん
ご確認いただきありがとうございました。
確かにもっと素直にMTArchiveListでそのまま出力しても大丈夫そうですね。長々とスペースをとってしまい失礼いたしました。
これからもブログ更新楽しみにしています。
いつもSSI使ってサイドバーなどに最新の記事を表示させていたので、今回はじめてはまったんですが、この記事のおかげで助かりました。
試してたら、ignore_archive_contextが同じテンプレート内に二つ有ると、カテゴリーアーカイブでエラーが出るようです。(うちだけかもしれませんが・・・)
なぜか月別アーカイブでは同じサイドバーを読み込んでてもエラーが出なかったのですが、カテゴリーアーカイブの時だけ発生しました。
MTは5.02です。
最近のエントリー一覧と、ピックアップエントリーみたいな感じでフィルタリングしたのを表示させる際にこのような現象が発生しました。
どうこうではなく、情報共有目的のご報告です。