MovableType備忘録の「ブログの最終更新日付を表示する」のコメント欄を見ていて、「じゃあダイナミック・パブリッシングでブログの最終更新日を動的に表示するにはどう書けば?」ということで、ちょっとのらせてもらいました。
「ブログの最終更新日付を動的に表示する」というのは、「古いアーカイブ頁でも常に最新の更新日を表示させたい」ということだと解釈してすすめさせていただこうと思います。
ところで一口に「ブログの最終更新日」といっても考え方や目的によっていろいろなパターンがありそうです。ここでは以下の3つのパターンを考えてみました。
■エントリー投稿・更新、コメント、トラバ全てを含むブログの最終更新日
実はMTにはブログの更新日を表示するためのタグ<$MTDate$>が標準で用意されてまして、それをトップ頁に記述すれば難しいことをしなくても一発で最終更新日を表示することができます。ただ、このタグは「その頁が再構築された日時を表示する」という仕様のため、ダイナミック下で使うと「ブログの更新日」ではなくて、「貴方がこの頁にアクセスした瞬間の日時♪」になってしまいます(笑)。
わざとそういう使い方をしてみるのも面白いのですが(こちらを参照)、ここではダイナミック下でこのタグを正しく「ブログの更新日」として使う方法を書いてみます。
1.メインインデックスのテンプレートで新しいテンプレートを作成し、以下の内容を書き込んで、update.htmlなどという名前で保存します。
最終更新日:<$MTDate$>
「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」にチェックを入れます。ダイナミックにはせずに静的生成パーツになるようにします。
2.ダイナミックで動かしている頁に以下のタグを使って上の内容を読み込みます。
<$MTInclude file="update.html"$>
これでどのダイナミック頁でもちゃんと正しく常に最新のブログ更新日が表示されることになります。
<注:MT4.38以上をお使いの方へ>
MT5.13、5.07、および4.38以降のバージョンではfileモディファイアが標準で無効化されています。fileモディファイアを使うにはmt-config.cgiに以下を追記します。
AllowFileInclude 1
■最新エントリーの投稿・更新日をブログの更新日とする場合
上の<$MTDate$>はエントリーの投稿・更新だけでなく、コメントやトラックバックによる更新も反映されます。コメントやトラバは更新に入れたくない、最新のエントリーが一番最後に更新された日時でいい、という場合。update.htmlの内容を下記のものに変えます。
<MTEntries lastn="1">最終更新日:<$MTEntryModifiedDate$></MTEntries>
■エントリーが更新された日時をブログの更新日とする場合
エントリーの更新は最新のものばかりとは限りません。新しい投稿がなくても水面下では過去のエントリーに修正や追記を行うことってありますよね。コメントやトラバは更新に入れたくないけど、過去記事の更新は反映させたいという場合。update.htmlの内容を下記のものに変えます。
なお、「更新のあったエントリーの最新1件の更新日」を表示させるにはMTタグだけでは出来ませんので、ここだけはプラグインを使います(参照)。エムロジック放課後プロジェクトよりCounter Pluginをダウンロードして説明に従ってセットしておいて下さい。ここでは更新された全エントリーを更新順に並び替え、その中から最新の一件を取得する、という方法をとっています。
<MTCounter>
<MTEntries lastn="0" sort_by="modified_on">
<$MTCounterPlus$>
<MTCounterIfEqual value="1">
最終更新日:<$MTEntryModifiedDate$>
</MTCounterIfEqual>
</MTEntries>
</MTCounter>
更新されたエントリーへのリンクを付けてみても面白いかもしれません。その場合は以下のようにします。
<MTCounter>
<MTEntries lastn="0" sort_by="modified_on">
<$MTCounterPlus$>
<MTCounterIfEqual value="1">
最終更新日:<a href="<$MTEntryPermalink$>" title="<$MTEntryTitle$>"><$MTEntryModifiedDate$></a>
</MTCounterIfEqual>
</MTEntries>
</MTCounter>
*lastn属性に"0"を使って全エントリーを取得するというのは小粋空間さんからアイデアをいただきました。これ、便利でいいですね(^^
☆注意事項☆
トップ頁やアーカイブ頁(インデックステンプレートで生成させている頁)を静的生成にしている場合は、そられの頁には<$MTInclude$>は使わず、テンプレート内に直接タグを記述して下さい。理由は再構築される順番によっては最新の内容が反映されないことがあるからです。update.htmlがindex.htmlより後に再構築されると(実はそのパターンが多い)更新される前の情報が読み込まれてしまうので、ワンテンポ遅れた状態になってしまいます(^^;。ご注意のほどを。
☆注意事項その2☆
上記の方法はいずれもダイナミック・パブリッシングを使う場合にのみ有効です。静的生成下では<$MTInclude$>はダイナミック時のような動的な動きをしてくれないので、わざわざ再構築をかけない限り情報が新しくなりません(参考)。静的生成で同じことを動的に行うにはMovableType備忘録さんのようにphpを使う方法がありますが、phpが使えない、更新日のためだけに拡張子をphpにするのも嫌だという場合もあると思います。そういう時はjavascriptを使われるといいと思います。こちら辺りが参考になるかと思います。
<追記>静的生成で「ブログの最終更新日を全頁で動的に表示する方法」を書いてみました。
<2007.2.9 追記&修正>
サイトパス部分を修正、参考リンク先の追加。
<2007.2.12 追記>静的生成での動的表示方法へのリンク追加。
コメント
oscar | 2007年2月 7日 21:33
あらら、私冗談のつもりだったんですが・・・(笑)
ほんとはですね・・・たぶんbzbellさんの書いたSQL文を、直接PHPで発行しちゃうのが、ベストだと思ってます。でもそれ手を言っちゃうと、なんかMTの枠ん中で楽しんでるのが、半減しちゃうようで控えてたんですけどね。
実際コード自体はそれほど難しくないと思う。
最後の例は面白いアプローチですね。これ見てて思うんですけど、Counterプラグインってbreak(ループから抜ける)タグがあった方が良い気がしませんか。
あんまり意味ないかな?
TAEKO | 2007年2月 8日 13:54
いえいえ、こちらものらせてもらっただけですから(笑)。
それにダイナミックで同じことをやる時のポイントどころを書いておくのも悪くないなと思ったもので。
>MTの枠の中で楽しむ
ああ、それ、ありますよね。Smarty使いまくっていて言うのもなんですけど、MTタグで出来ることは出来るだけMTタグでやっていきたい、というのは根っこにあります。
>Counterプラグイン
面白いですよね。これでもっといろいろ遊べないかなあと思ってます。
ループから抜けるタグ…あると便利なのかな? まだまだ使いこなせていないので、いろいろ試していってみようと思います。