Movable TypeでMTPagesタグとMTEntriesタグを入れ子にして動作させる方法

Movable TypeでMTPagesタグとMTEntriesタグを入れ子にして動作させる方法

Posted at November 7,2011 1:55 AM
Tag:[Customize, Entry, MovableType, WebPage]

Movable Typeのブログ記事とウェブページの一覧を入れ子にして動作させる方法を紹介します。

MTQに投稿された質問のやりとりで気がついたのですが、本エントリーで紹介する方法で正常に動作できるようです。

1.ウェブページとブログ記事の設定状態

同一のブログ(ブログID=2)に、次のタイトルでウェブページとブログ記事をそれぞれ3つずつ投稿しているものとします。ブログ記事はウェブページと異なるブログでも構いませんがここでは同一ブログとします。

ウェブページ

  • 製品A
  • 製品B
  • 製品C

ブログ記事

  • 製品Aのニュース
  • 製品Bのニュース
  • 製品Cのニュース

2.ウェブページ一覧にブログ記事一覧を表示(失敗例)

1項の記事が投稿されている状態で、次のサブテンプレートを設定したインデックステンプレートを作ります。

<mt:Pages>
  <mt:PagesHeader>
<ul>
  </mt:PagesHeader>
  <li>Page: <$mt:PageTitle$></li>
  <mt:Entries>
    <mt:EntriesHeader>
    <ul>
    </mt:EntriesHeader>
      <li>Entry: <$mt:EntryTitle$></li>
    <mt:EntriesFooter>
    </ul>
    </mt:EntriesFooter>
  </mt:Entries>
  <mt:PagesFooter>
</ul>
  </mt:PagesFooter>
</mt:Pages>

このインデックステンプレートを再構築すると、次のようにブログ記事タイトルの部分にウェブページタイトルが出力されてしまいます。

ブログ記事タイトルの部分にウェブページタイトルが出力

これはウェブページのコンテキストとブログ記事のコンテキストが干渉するためと思われます。

3.ウェブページ一覧にブログ記事一覧を表示(成功例)

そこで、次のようにMTEntriesタグにinclude_blogsタグを与えます。

<mt:Pages>
  <mt:PagesHeader>
<ul>
  </mt:PagesHeader>
  <li>Page: <$mt:PageTitle$></li>
  <mt:Entries include_blogs="2">
    <mt:EntriesHeader>
    <ul>
    </mt:EntriesHeader>
      <li>Entry: <$mt:EntryTitle$></li>
    <mt:EntriesFooter>
    </ul>
    </mt:EntriesFooter>
  </mt:Entries>
  <mt:PagesFooter>
</ul>
  </mt:PagesFooter>
</mt:Pages>

これで、ブログ記事タイトルが適正に出力されるようになります。

ブログ記事タイトルが適正に出力

include_blogsモディファイアでブログIDを指定するので、ウェブページとブログ記事は異なるブログでも構いません。

4.ウェブページ一覧に関連のブログ記事一覧を表示(その1)

この方法を利用して、ウェブページ一覧に関連のブログ記事一覧を表示させてみます。

3項のサブテンプレートを使って、MTPageTitleを変数page_titleに保持し、MTEntriesタグ内にMTIfタグを追加して、ウェブページタイトルとブログ記事タイトルを比較します。

<mt:Pages>
  <mt:PagesHeader>
<ul>
  </mt:PagesHeader>
  <li>Page: <$mt:PageTitle$></li>
  <$mt:PageTitle setvar="page_title"$>
  <mt:Entries include_blogs="2">
    <mt:EntriesHeader>
    <ul>
    </mt:EntriesHeader>
    <mt:if tag="EntryTitle" like="$page_title">
      <li>Entry: <$mt:EntryTitle$></li>
    </mt:if>
    <mt:EntriesFooter>
    </ul>
    </mt:EntriesFooter>
  </mt:Entries>
  <mt:PagesFooter>
</ul>
  </mt:PagesFooter>
</mt:Pages>

これで製品ウェブページに関するブログ記事を振り分けて表示することができます。

製品ウェブページに関するブログ記事を振り分けて表示

5.ウェブページ一覧に関連のブログ記事一覧を表示(その2)

4項よりさらに現実的な方法として、ブログ記事のカテゴリに「製品A」「製品B」「製品C」をそれぞれ与え、ウェブページタイトルとブログ記事のカテゴリ名で判定するようにします。

<mt:Pages>
  <mt:PagesHeader>
<ul>
  </mt:PagesHeader>
  <li>Page: <$mt:PageTitle$></li>
  <$mt:PageTitle setvar="page_title"$>
  <mt:Entries include_blogs="2">
    <mt:EntriesHeader>
    <ul>
    </mt:EntriesHeader>
    <mt:if tag="EntryCategory" eq="$page_title">
      <li>Entry: <$mt:EntryTitle$></li>
    </mt:if>
    <mt:EntriesFooter>
    </ul>
    </mt:EntriesFooter>
  </mt:Entries>
  <mt:PagesFooter>
</ul>
  </mt:PagesFooter>
</mt:Pages>

これも4項と同様の結果を得られます。

6.注意事項

MTEntriesタグ内でMTPageに関するテンプレートタグを使うとコンテキストエラーになるので、MTEntriesタグでウェブページに関する情報を利用したい場合は、MTEntriesタグの前で変数に保持してください。

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)