ダイナミックパブリッシングのテンプレートにPHPを直接に書く

Movable TypeのテンプレートにPHPのコードを直接に書いて、さまざまな処理を行うこともできます。
ただ、スタティックパブリッシングとダイナミックパブリッシングでは、PHPのコードを書く際の書き方が違います。
その点について解説します。

1.PHPのコードをSmartyのタグで囲む

スタティックパブリッシングの場合、テンプレートの中に「<?php」~「?>」のPHPのブロックを入れて、PHPのコードを直接に書くことができます。
一方、ダイナミックパブリッシングでは、この方法を使うことはできません。
ダイナミックパブリッシングは内部的にSmartyを使っていますので、Smartyの書き方をする必要があります。

通常のSmartyでは、テンプレート内にPHPのコードを直接に書くには、「{php}」と「{/php}」のブロックを入れます。
ただし、Movable Typeのダイナミックパブリッシングでは、Smartyのタグを「{{」と「}}」で囲むようになっています。
したがって、テンプレート内に「{{php}}」と「{{/php}}」のブロックを入れれば、その中にPHPのコードを直接に書くことができます。

例えば、テンプレートに以下を追加するとします。
このページを表示すると、PHPのブロックの位置に、現在の日時が出力されます。

{{php}}
echo date('Y年m月d日 H時i分');
{{/php}}

2.テンプレートタグをPHPのコードに入れない

スタティックパブリッシングのテンプレートにPHPのコードを入れる場合、そのコードの中にテンプレートタグを混ぜて書くことができます。
例えば、以下のように書くとします。

$blog_name = '<$mt:BlogName$>';

この場合、再構築の時点でMTBlogNameタグが実際のブログ名に置き換わります。
そして、ページを表示する時点でPHPが実行されて、変数$blog_nameにブログ名が代入されます。

一方、ダイナミックパブリッシングを使って、以下のように書くとします。

{{php}}
$blog_name = '<$mt:BlogName$>';
{{/php}}

このように書くと、残念ながらページを表示する際にエラーになります。

テンプレートタグの値をPHPのコードの中で使いたい場合は、そのテンプレートタグの値をMTSetVarタグでテンプレートの変数に代入し、それをPHPの変数に代入する、という手順を取ります。
例えば、上の例のように、ブログ名を変数$blog_nameに代入するなら、テンプレートに以下のように書きます。

<$mt:BlogName setvar="blog_name"$>
{{php}}
global $mt;
$vars =& $mt->context()->__stash['vars'];
$blog_name = $vars['blog_name'];
{{/php}}

3.なるべくプラグイン化する

ここまでで述べたようにすれば、テンプレートにPHPのコードを直接に書くことができます。
ただ、なるべくは、テンプレートに直接にコードを書かずに、その処理をプラグイン化することをお勧めします。

ダイナミックパブリッシングはSmartyで処理されますので、プラグインの作り方もSmartyに沿った形になります。
Smartyでダイナミックパブリッシング用のプラグインを作る方法は、またの機会に解説したいと思います。