include_blogsつきのMTEntriesタグのブロックでMTIncludeタグを使う際の注意点

先日、「MTIncludeタグでテンプレートモジュールを読み込もうとすると、そのテンプレートモジュールがブログにあるにも関わらず、『テンプレートが見つかりませんでした』とエラーが表示される」という質問を受けました。
Movable Typeにログインさせていただいて状況を確認したところ、MTEntriesタグのinclude_blogsモディファイアが原因であることが分かりました。

1.問題の原因

質問された方のテンプレートを拝見すると、以下のような部分がありました。

<mt:Entries include_blogs="2">
  ...
  <mt:Include module="foo">
  ...
</mt:Entries>

MTIncludeタグでテンプレートモジュールを読み込む場合、通常はそのテンプレートが属するブログから、テンプレートモジュールを読み込みます。
しかし、MTEntriesタグにinclude_blogsモディファイアを指定し、他のブログから記事を読み込んでいる状況では、記事があるブログからテンプレートモジュールを読み込もうとします。

上のテンプレートの例だと、「include_blogs="2"」のモディファイアを指定しているため、IDが2番のブログから記事を読み込みます。
この状況でMTIncludeタグを実行すると、「foo」テンプレートモジュールも、IDが2番のブログから読み込みます。
そのため、IDが2番のブログに「foo」テンプレートモジュールがないと、「テンプレートモジュールが見つかりませんでした」のエラーが発生します。

2.回避方法

この問題を回避するには、以下のようにします。

  • MTEntriesタグのブロックに入る前に、テンプレートが属するブログのIDを変数にセットします。
  • MTIncludeタグに「blog_id="$変数"」のモディファイアを追加し、テンプレートが属するブログからテンプレートモジュールを読み込みます。

例えば、1.で挙げたテンプレートの場合、以下のように書き換えます。

<$mt:BlogID setvar="this_blog_id"$>
<mt:Entries include_blogs="2">
  ...
  <mt:Include module="foo" blog_id="$this_blog_id">
  ...
</mt:Entries>

1行目のMTBlogIDタグで、変数this_blog_idに、テンプレートが属するブログのIDを代入します。
そして、4行目のMTIncludeタグに「blog_id="$this_blog_id"」のモディファイアを追加し、テンプレートが属するブログから、「foo」テンプレートモジュールを読み込みます。