Movable Type 3.1のダイナミック・パブリッシングによって、テンプレートごとに、スタティック・ページをダイナミック・ページと組み合わせて作成することができます。 そして、ウェブログのパブリッシングとトラフィックのバランスを取ることができます。 サイトのインデックスやフィードのように頻繁にリクエストされるページでは、スタティック・ページの生成をオンにし、月ごとに更新するページや、個人的なページ、アーカイブのページなどには、ダイナミック・ページを使うといったことが可能になります。 この機能は、手動でファイルを再構築する手間を完全に省きます。たとえば、アーカイブ・テンプレートのデザインを更新する際に、サイトのデザインは、あなた自身が再構築しなくても、直ちに更新されるようになります。
Movable Typeの必要条件に加えて、ダイナミック・パブリッシング・オプションには、以下の要件が必要です。
# Disable fancy indexes, so mtview.php gets a chance...
Options -Indexes
  <IfModule mod_rewrite.c>
  # The mod_rewrite solution is the preferred way to invoke
  # dynamic pages, because of its flexibility.
   # Add mtview.php to the list of DirectoryIndex options, listing it last, 
  # so it is invoked only if the common choices aren't present...
  <IfModule mod_dir.c>
    DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /mtview.php
  </IfModule>
   RewriteEngine on
   # don't serve mtview.php if the request is for a real directory
  # (allows the DirectoryIndex lookup to function)
  RewriteCond %{REQUEST_FILENAME} !-d
   # don't serve mtview.php if the request is for a real file
  # (allows the actual file to be served)
  RewriteCond %{REQUEST_FILENAME} !-f
  # anything else is handed to mtview.php for resolution
  RewriteRule ^(.*)$ /mtview.php [L,QSA]
</IfModule>
 <IfModule !mod_rewrite.c>
  # if mod_rewrite is unavailable, we forward any missing page
  # or unresolved directory index requests to mtview
  # if mtview.php can resolve the request, it returns a 200
  # result code which prevents any 4xx error code from going
  # to the server's access logs. However, an error will be
  # reported in the error log file. If this is your only choice,
  # and you want to suppress these messages, adding a "LogLevel crit"
  # directive within your VirtualHost or root configuration for
  # Apache will turn them off.
  ErrorDocument 404 /mtview.php
  ErrorDocument 403 /mtview.php
</IfModule>
(.htaccessファイルがある場合は、その最後に上記のコードを加えてください。)
上述の``mtview.php''スクリプトは、一度、新しい「ダイナミック・サイト起動用スクリプト」インデックス・テンプレートを再構築すると、作成されます。 ウェブログ・ルートがサイトのサブディレクトリにある場合は、``mtview.php''スクリプトへのパスを実際の場所になるよう、上記の .htaccess の設定を変更してください(例えば、ウェブログ・ルートが``weblog''ディレクトリにある場合、パスは``/weblog/mtview.php''に修正します)。
Movable Type では、従来のスタティック・パブリッシングに加え、ダイナミック・パブリッシングをオプションとして加えました。 どちらか一方だけを選択する必要はありません。両方混在して使えます。
例えば、インデックスやアーカーブ・テンプレートにはダイナミック・パブリッシングを使い、そのほかのページにはスタティック・パブリッシングを使うことができます。 これは、サイトのパブリッシングの方法に柔軟性を与えてくれます。 インデックスとAtom/RSS/RDFフィードのページにかなりのトラフィックがあるようなサイトでは、こうしたページだけをスタティックに公開する、などを実現できます。
アーカイブ・ページは、トラフィック量が少なく、かつ、最も大きなディスク・スペースを占めるので、通常、ダイナミック・パブリッシングに適しています。
ダイナミック・パブリッシングを使うと、キャッシュされない各ページのビューには、そのページを構築するため、多くのデータベース・クエリー(問い合わせ)が発生します。 ウェブサーバーの性能とテンプレートの複雑度によって異なりますが、1秒もかからないこともあれば、数秒かかる場合もあります。 以下は、ダイナミック・ページの処理速度を最適化するのに、役立つヒントです。
<MTEntries lastn="10">
このパラメータは任意の値に調整できます。
注: これは実験的な機能であり、環境によってはうまく動作しないこともあります。
ダイナミック・パブリッシングを最適化する別の方法は、ページ・レベルのキャッシングをオンにすることです。 この機能によって、ダイナミック・ページは、1つのリクエストから次のリクエストに移行する間、ファイル・システムにキャッシュされるので、スタティック・ページに近いスピードが得られます。 長期的に見ると、これはディスク・スペースをより多く消費しますが、性能上の利点がそれに勝るかもしれません。
ページ・レベルのキャッシングをオンにするには、ウェブログのルート・ディレクトリに``cache''サブディレクトリを作成する必要があります。 さらに、777のパーミッションを与える必要があります。 次に、「ダイナミック・サイト起動用スクリプト」インデックス・テンプレートに次の行を加えます。
$mt->caching = true;
この行は``$mt->view();''の行の上に加えてください。 この行を削除すると、キャッシング・オプションが無効になります。
これを設定すると、ダイナミック・ページを表示するときに、作成したキャッシュ・ディレクトリ内にキャッシュするようになります。 キャッシュされた後は、ウェブログ・コンテンツがそのキャッシュされたページより新しい場合、またはリクエストを受けた場合に限り、1ページずつ再構築されます
ダイナミック・ページに、条件付きリクエスト(HTTP 304応答)を設定できます。 通常、ページがダイナミックに生成される場合、ページは条件なしで生成されます。 中にはこうした状態が適しているケースがあるため、条件付きリクエストはデフォルトでオフになっています。 条件付きリクエストは``mtview.php''スクリプトに以下の行を加えると有効になります。
$mt->conditional = true;
この行は``$mt->view();''の行の上に加えてください。 条件付きリクエストに関連付けられたタイムスタンプは、ウェブログが最後に変更された時間です。変更とは、コメント、トラックバックping、テンプレートなど、ウェブログのどの部分に対しての変更も意味します。
さらに機能をアップして、条件付き動作を条件付きで設定できます。 以下はフィードのページで、この機能をオンにするコードです。
if (preg_match('/(index|atom)\.(rss|xml|rdf)/',
               $_SERVER['REQUEST_URI'])) {
    $mt->conditional = true;
}
Movable Typeのダイナミック・パブリッシング・モードはプラグインもサポートします。 これまでの Perl のプラグインと比べると、アーキテクチャは異なりますが、似ている点もあります。
PHPベースのダイナミック・パブリッシング・エンジンの2つの主要なコンポーネントは、Smarty テンプレート・パッケージ(http://smarty.php.net/)とJustin VincentのezSQLライブラリ(http://php.justinvincent.com/)です。
Movable Typeのメイン・ディレクトリにある``php''サブディレクトリには、ダイナミック・パブリッシング・エンジンに関連するすべてのファイルとリソースがあります。
mt/php/
       lib/      MT標準のタグとモジュール
       extlib/   サードパーティ・パッケージ(ezSQLとSmarty)
       plugins/  サードパーティMT/PHPプラグイン
プラグインのファイルは、`plugins''ディレクトリの中に入れてください。 MT/PHPプラグインを開発するには、Smarty用のプラグインを作成する方法に精通している必要があります。 MT/PHPプラグインにおいて、カスタムblockはコンテナ・タグを、カスタムfunctionは変数タグを、およびカスタムmodifierはグローバル・フィルターを加えるためのベースとなります。
<?php
function smarty_function_MTServerUptime($args, &$ctx) {
    $data = shell_exec('uptime');
    return $data;
}
?>
Uptime: <$MTServerUptime$>
<?php
function smarty_block_MTLoop($args, $content, &$ctx, &$repeat) {
    if (!isset($content)) {
        $i = 1;
    } else {
        $i = $ctx->stash('i_value') + 1;
    }
    if ($i <= 5) {
        $repeat = true;
    } else {
        $repeat = false;
    }
    $ctx->stash('i_value', $i);
    return $content;
}
?>
次に``php/plugins/function.MTLoopIValue.php''を作成します。
<?php
function smarty_function_MTLoopIValue($args, &$ctx) {
    return $ctx->stash('i_value');
}
?>
<?php
function smarty_block_MTEntryIfTitle($args, $content, &$ctx, &$repeat) {
    if (!isset($content)) {
        $e = $ctx->stash('entry');
        $title = $e['entry_title'];
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat, trim($title) != '');
    } else {
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
    }
}
?>
なお、条件タグは、そのタグ名に``If''を含め、<MTElse>コンテナ・タグと共に正しく機能するようにする必要があります。
<?php
function smarty_modifier_rot13($s, $arg) {
    // str_rot13はPHP 4.2.0以降で使用可能です。
    return str_rot13($s);
}
?>
このフィルターは以下のように使います。
<$MTEntryTitle rot13="1"$>
$ctx変数へアクセスする必要がある場合は、グローバルの``$mt''変数を通してアクセスできます。``$mt''変数は、テンプレート・コンテキスト(Smartyオブジェクト)を返すメソッド名の付いたコンテキストを持ちます。
Smartyルーチンの書き方についての詳細は、Smartyのウェブサイト(英語)を参照してください。 http://smarty.php.net/manual/en/plugins.php