Blog

ブログ

Movable Typeの弱点を克服する「DynamicMTML」の使いどころ

今更なのですが、Movable Type案件に「DynamicMTML」を導入しました。

DynamicMTMLの特徴、使いどころ、既存サイトに導入してみての注意点などを書いてみます。

DynamicMTMLとは

DynamicMTMLは、アルファサード社が開発、無償公開しているMovable Typeのアドオンです。
アドオンはプラグインよりも大きな拡張を追加する、兄貴分のようなものです。
MTOSにも使用できます。

導入方法は、配布されているパッケージの「addon」ディレクトリ以下をアップロードして、各ブログの全体設定で有効化するだけです。

かたつむりくんの奥脇さん(@tinybeans)がひじょうに詳しい解説記事を書いていますから、情報には困らないと思います。

主な機能

導入すると、mt:DynamicMTMLタグで囲んだMTML(Movable Typeの独自タグ)を、ファイルにアクセスがあったときに都度処理させられるようになります。

例えば、以下のようにテンプレートを書くと

<h1><mt:BlogName encode_html="1" /></h1>

<p>ファイルを作成した時刻:<mt:Date format="%X"></p>

<mt:DynamicMTML>

<p>ファイルを表示した時刻:<mt:Date format="%X"></p>
<mt:Entries limit="3">
<p><mt:EntryTitle encode_html="1" />(<mt:EntryDate format="%X">)</p>
</mt:Entries>

</mt:DynamicMTML>

12:01に行った再構築直後は、以下のようにMTMLが残った状態でファイルが書き出され

<h1>ブログの名前</h1>

<p>ファイルを作成した時刻:12:01</p>

<p>ファイルを表示した時刻:<mt:Date format="%X"></p>
<mt:Entries limit="3">
<p><mt:EntryTitle encode_html="1" />(<mt:EntryDate format="%X">)</p>
</mt:Entries>

そのファイルに14:59にアクセスすると、MTMLの部分はアクセス時点の内容で処理します。

<h1>ブログの名前</h1>

<p>ファイルを作成した時刻:12:01</p>

<p>ファイルを表示した時刻:14:59</p>

<p>エントリーその3(14:32)</p>
<p>エントリーその2(11:07)</p>
<p>エントリーその1(09:24)</p>

例の場合、「ファイルを作成した時刻」は静的なままで、「ファイルを表示した時刻」とエントリー一覧が最新の内容になります。

パッと思い付く使い方は、現在時刻を調べてコンテンツの一部を時限公開したり、秒数をもとにバナーをランダム表示するなどです。
また、簡単な処理であれば、PHPスクリプトを書かなくてもMTMLで対応できるようになりますし、PHPを直接実行させることも可能です。

DynamicMTMLの使いどころ

いろいろなブログで紹介されていますが、いちばんわかりやすいのが、ページ分割だと思います。

一般的なブログは、トップページがそのまま最新の記事一覧になり、一覧の下にはページネーションが表示されます。

また、実際の案件では、トップページには特に見てほしい記事のリンクだけを表示し、過去の記事一覧は、別途「バックナンバー」というページを設けて表示するという構成もよくあります。

このとき、インデックスページをダイナミック・パブリッシングにすると、ページネーションを出せません。
アーカイブテンプレートでしかページ分割ができないからです。

なので、この場合はスカイアーク社が提供しているPagebuteプラグインを利用することが考えられるのですが…

スタティック・パブリッシングなので、過去ログが数百件になると、サーバーが滅多に参照されないHTMLファイルでいっぱいになってしまいます。

DynamicMTMLを導入すると、URLの末尾に「?page=1」などの「クエリ」を付けて、ページ数をもとに記事を呼び出したり、ページネーションを作ったりできるようになります。

具体的な考え方と実装方法は、柳谷さん(@mersy)の記事が参考になります。

私の方でも、案件で実装したものを、いろいろコードスニペットにアップしますね 🙂


他にも、これまでのMovable Typeが、静的なばっかりに散々WordPressと比較されていたあんなことやこんなこともできるようになります。

  • 閲覧権限のある登録ユーザーだけ見られるページを作る
  • アクセスしてきた端末ごとに表示を分ける
  • 検索サイトからのリファラを取る

注意点

導入時に.htaccessの書き換えが必要

DynamicMTMLを有効にすると、.htaccessの更新が必要になります。

特に、mod_rewriteに関わる部分が大幅に変更されますから、現行サイトで.htaccessを編集していたり、他のCMSと共存する場合は、入念な検証を行ってください。
アクセスが少ない時間にインストールするか、テストサーバーの用意が必要でしょう。

学習コストが高い

私がDynamicMTMLを導入してこなかったのは、学習コストが高い割に、どうしても必要な状況がなかったからです。
私はMovable Typeを8年くらい使っていますが、今回、機能を理解して、やりたかったことを実装するのに二日くらいかかっています。

特に、こちらの記事で説明、補足している通り、アクセスした時点のデータを変数に代入し、その値をモジュールに渡すときの処理がシビアになります。
既存のテンプレートの構造によっては、改修する必要も出てきます。

コードを間違ったときの解決がしにくい

これは、ダイナミック・パブリッシングでも同様ですが、MovableTypeは変数の書き間違いがあったときにエラー文を出しません(タグの閉じ忘れは警告します)。

DynamicMTMLの場合は、ページが真っ白になるか、404ページになります。
エラーの内容がわからないため、いちど詰まってしまうと問題の解決に時間がかかります。
静的に出力してみてテストするのがいいのではと思います。

ぶっちゃけ、PHPの方がわかりやs…うわなにをするやめろ

Movable Typeの独自タグ、MTMLは、プログラミング言語並みの拡張性を持っています。
変数の計算、配列はもちろん、正規表現置換や繰り返し処理もできます。
PHPではなくMTMLを使うことで、テンプレート内にプログラムを直接書くことによる矛盾や、問題を回避できます。

ですが、複雑な処理をするなら、やっぱりPHPの方がJavaScriptに書式が近いこともあり、わかりやすいです。

今回、イメージしている機能を実装するのに書いたMTMLを見て、これを私以外の人に、なにをやってるのか伝えるのは難しいだろうなあ…と思いました。

まとめ

DynamicMTMLには、かなりの魅力と可能性があります。

Movable Typeの元々の良さを残せば、サーバーに負荷をかけず、更新がサクサクで、2ch砲やYahoo!砲にも耐えられるサイトを構築できるのは間違いないです。
(実際、アルファサードでは多くの有名企業でこれを導入しているようです)

ですが、特徴を理解して実際の案件に導入するには、既存のMovableTypeをそうとう理解している必要があります。
少なくとも、サーバーの簡単インストールで利用していたユーザーや、変数機能がなかった、3.xまでのユーザーが戻ってくる材料にはならないでしょう。

これまでMovableTypeをかなり使ってきた、内製中心の制作会社さんには、一日つぶしてでも習得することをおすすめします。
中間の会社から受注する、外注中心の制作会社さんや、フリーランスの人は、先方との意識ズレが起きないよう、慎重に提案・導入してください。

…というわけで、もっと使ってみたいので、こってりしたMovable Type案件お待ちしております。

てへぺろ 😛