スタティック/ダイナミックパブリッシングの共存を考える(その1)

Movable Typeの特徴の1つとして、テンプレートを静的(スタティック)に再構築して、ファイルに出力することがあげられます。
一方で、ページにアクセスがあった時に動的にページを出力する「ダイナミックパブリッシング」の機能もあります。

ただ、Movable Type本体がPerlで作られているのに対し、ダイナミックパブリッシングはPHPで作られています。
ダイナミックパブリッシングに対応していないプラグインが多くあるため、ダイナミックパブリッシングはあまり積極的に活用されていないと思います。

しかし、ダイナミックパブリッシングはMovable Typeに標準である機能なので、できればうまく使いたいところです。
そこで、スタティックパブリッシングとダイナミックパブリッシングを上手く組み合わせる方法を考えていきたいと思います。

1.スタティックパブリッシング専用のプラグインをダイナミックパブリッシングで何とか使いたい

前述したように、Movable Typeのプラグインでは、スタティックパブリッシング専用のものが多いです。
そのため、スタティックパブリッシング専用のプラグインに依存したテンプレートを作ると、そのテンプレートをダイナミックパブリッシングにした時に、「テンプレートタグが存在しない」というようなエラーが発生します。

残念ながら、スタティックパブリッシング専用のプラグインを、ダイナミックパブリッシングでシームレスに使うことはできません。
ただ、以下のようにすれば、シームレスではないですが、スタティックとダイナミックの共存が可能です。

  • スタティックパブリッシング専用のプラグインに依存する部分だけ、スタティックに再構築するようにします。
  • スタティックに再構築した結果を、ダイナミックパブリッシングのページに動的に組み込みます。

2.全ページに同じ出力を組み込みたい場合

スタティックパブリッシングの結果をダイナミックパブリッシングに組み込む場合、いろいろなパターンがあり得ます。
その中で最も簡単なのは、ブログの全てのページに、同じ出力を組み込みたい場合です。

例えば、拙作のSortCatFldプラグインを使ってカテゴリを並べ替え、ブログの全ページのサイドバーに、カテゴリの一覧を出力したいとします。
この場合、以下の手順を取ります。

  • カテゴリの一覧を出力する部分だけをインデックステンプレートとして作り、スタティックに出力するようにします。
  • ダイナミックパブリッシングを使うテンプレートでは、カテゴリの一覧を出力する部分をMTIncludeタグに置き換えて、出力済みのファイルを読み込むようにします。

例えば、カテゴリ一覧の部分を、「catlist.html」というファイルにスタティックに出力するとします。
この場合、以下のような内容のインデックステンプレートを作り、出力ファイル名を「catlist.html」にし、「公開」の設定を「スタティック」にします。
なお、以下のテンプレートは「クラシックブログ」のテーマに合わせてあります。

<mt:IfArchiveTypeEnabled archive_type="Category">
<div class="widget-archive widget-archive-category widget">
    <h3 class="widget-header">カテゴリ</h3>
    <div class="widget-content">
    <mt:SortedTopLevelCategories>
        <mt:SubCatIsFirst>
        <ul>
        </mt:SubCatIsFirst>
        <mt:If tag="CategoryCount">
            <li><a href="<$mt:CategoryArchiveLink$>"<mt:If tag="CategoryDescription"> title="<$mt:CategoryDescription remove_html="1" encode_html="1"$>"</mt:If>><$mt:CategoryLabel$> (<$mt:CategoryCount$>)</a>
        <mt:Else>
            <li><$mt:CategoryLabel$>
        </mt:If>
        <$mt:SubCatsRecurse$>
            </li>
        <mt:SubCatIsLast>
        </ul>
        </mt:SubCatIsLast>
    </mt:SortedTopLevelCategories>
    </div>
</div>
</mt:IfArchiveTypeEnabled>

そして、ダイナミックパブリッシングを使うテンプレートでは、カテゴリの一覧を出力する部分を、以下のタグに置き換えます。

<$mt:Include file="catlist.html"$>