【Movable Type】mt:ObjectLoopタグを使用して、ブログ記事の最新記事をサイドバーに出す


  • 公開:
  • 更新:
  • 編集:
概要 ▶ Movable Typeで汎用的な出力ができる「mt:ObjectLoop」タグを使用することで、アーカイブの種類に依存しない出力ができるようになります

20160621-mtObjectLoopでブログの最新記事を表示する-00

以前、Movable Typeにてウェブサイトのサイドバーにブログの最新記事●件を出す方法として、以下のブログ記事を書きました。

この中で、mt:MultiBlogタグとモディファイアの「ignore_archive_context="1"」を組み合わせて使ったテンプレートコードを紹介しました。

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


このテンプレートコードで、正常に動作していたのですが、とあるページを見てみると、ダメなページがありました。

正常に構築できていなかったページはカテゴリーアーカイブのページです。


会社のDTP情報のサイトなどは、月別アーカイブとカテゴリーアーカイブのテンプレートコードを一つにして使用して体裁を一緒にしているのですが、月別アーカイブは正常に構築されているのに、カテゴリーアーカイブは正常に構築されていなくて、内容が最新ではありませんでした。

エラーに気がつかなかったのは公開のタイミングが「公開キュー経由」の構築だったからです。

公開のタイミングを「スタティック」にしてみると「Can't call method "id" on an undefined value」というエラー表示。

20160621-mtObjectLoopでブログの最新記事を表示する-01

目次 [ 隠す ]
Loading...

ignore_archive_context="1"が複数あるとエラーになる?

調べてみると、藤本さんのブログのコメント欄で同じような現象に遭っている方が。

試してたら、ignore_archive_contextが同じテンプレート内に二つ有ると、カテゴリーアーカイブでエラーが出るようです。(うちだけかもしれませんが・・・)

なぜか月別アーカイブでは同じサイドバーを読み込んでてもエラーが出なかったのですが、カテゴリーアーカイブの時だけ発生しました。

MTは5.02です。

最近のエントリー一覧と、ピックアップエントリーみたいな感じでフィルタリングしたのを表示させる際にこのような現象が発生しました。

ブログの全ページに最新記事のリストを出力する裏ワザ(The blog of H.Fujimoto)

この方は「ignore_archive_context="1"」が同じテンプレートに2つあると(複数あると)エラーになるという報告でした。


会社のサイトでは「ignore_archive_context="1"」はひとつしかなく、この方とは違いましたが、カテゴリーアーカイブだけエラーが出るとのことで、カテゴリーアーカイブは何か鬼門なのかもしれません。



mt:ObjectLoopはコンテキストに依存しない

エラーを長々と書いてきましたが、やりたいことは「Movable Typeのコンテキストを無視して、ブログの最新記事を出す」ということです。


そんな時にピッタリのタグがありました。

それが「mt:ObjectLoop」タグです。(厳密にはブログのIDを指定しなくても、そのブログのデータを出力するのでコンテキストに全く依存しないわけではないのだが)


そんなMTタグ見たことがないという方もいると思いますが、標準のMTタグではありません。プラグインを追加することで実現できます。

アルファサードさんのGitHubのページからプラグインはダウンロードできます。


プラグインをインストールしたら、あとは以下のテンプレートコードを書けばOKです。

<mt:ObjectLoop model="entry" status="2" sort_order="descend" sort_by="authored_on" limit="5">
    個々のブログ記事の情報を出力するテンプレートタグ
</mt:ObjectLoop>


もうちょっと具体的に書けばこんな感じでしょうか。

mt:EntryHeaderタグやmt:EntryFooterタグは使えないので、予約変数の「__first__」「__last__」を使用します。

<mt:ObjectLoop model="entry" status="2" sort_order="descend" sort_by="authored_on" limit="5">
    <mt:If name="__first__">
        <ul>
    </mt:If>
    <li><a href="<$mt:EntryPermaLink$>"><$mt:EntryTitle$></a></li>
    <mt:If name="__last__">
        </ul>
    </mt:If>
</mt:ObjectLoop>



モディファイアのstatus="2"って何よ

先程のテンプレートコードのmt:ObjectLoopタグのモディファイアで「status="2"」というものがありますが、これは何でしょう?

このモディファイアを外して試してみると分かりますが、「未公開(原稿・下書き)」の記事も表示されます。

つまりstatusは、そうした公開・未公開をフィルターするためのモディファイアだとわかります。


では数字は何を表しているのかというと、以下の通りです。

  • 1 = 未公開(原稿・下書き)
  • 2 = 公開
  • 4 = 日時指定

(ブログ記事の編集画面のサイドバーのHTMLを見ると分かります)


なので、「status="2"」でフィルタリングしないと、未公開の記事も、日時指定の記事(だいたいは未来の記事かな)も表示されてしまうのです。

「status="1"」を使えば、未公開の記事一覧を作ることもできます。


このmt:ObjectLoopはモディファイアで色々フィルタリングできるので、「<mt:archivelist archive_type="Individual" lastn="10">」といったmt:ArchiveListタグを使ったブログ記事の出力よりも柔軟な出力が可能です。(普段はこれでOKだと思いますが)

ちょっと凝った案件があったら試してみてはいかがでしょうか。


それでは、よいMovable Typeライフを。



参考にしたスライド

カテゴリー:

このページをぜひシェアしてください