Movable Typeで特定カテゴリのコメントを表示する方法

Movable Typeで特定カテゴリのコメントを表示する方法

Posted at July 19,2013 12:55 AM
Tag:[Category, Comment, Customize, MovableType]

Movable Typeで特定のカテゴリに属する記事のコメントを表示する方法を紹介します。

1.問題点

コメント関連のテンプレートタグにはコメント投稿された記事のカテゴリで絞り込むモディファイアが用意されていないため、単純に絞り込むことができません。

たとえば、カテゴリ「foo」に属する記事のコメントを最新10件表示させたい場合、次のテンプレートで実現するものとします。

<mt:Comments lastn="0">
  <mt:CommentEntry>
    <mt:if tag="EntryCategory" eq="foo">
      <$mt:CommentDate format="%Y%m%d%H%M%S" setvar="date"$>
      <mt:SetVarBlock name="list" key="$date" append="1">
<li><$mt:CommentAuthor$>:<a href="<$mt:CommentLink$>" title="<$mt:EntryTitle$>へのコメント"><$mt:CommentBody remove_html="1" words="15"$></a></li></mt:SetVarBlock>
    </mt:if>
  </mt:CommentEntry>
</mt:Comments>
 
<mt:loop name="list" sort_by="key reverse">
  <mt:if name="__first__"><ul></mt:if>
  <mt:if name="__counter__" le="10">
    <$mt:var name="__value__"$>
  </mt:if>
  <mt:if name="__last__"></ul></mt:if>
</mt:loop>

テンプレートの説明ですが、一番外側のMTCommentsタグの中でコメント投稿元の記事をMTCommentEntryタグで抽出し、さらにその記事が属するカテゴリをMTIfタグで判定し、カテゴリが「foo」であればハッシュ変数に保存します。

そしてMTCommentsタグのすべての処理が終わったあとでハッシュ変数をキー(コメント投稿日付)でソートして、10コメント分を出力します。

ただ、このテンプレートタグには以下の問題があり、実用的ではありません。

  • 10件のコメントを表示させるためにMTCommentsタグを何回ループさせればいいか分からないので(=どこで該当カテゴリ記事のコメントが出現するか分からないので)、最大コメント数分ループさせる必要があります。
  • ループの途中で10件に到達しても処理を止めることができない(カウンタと判定文を追加すればある程度スキップは可能)
  • コメント数と記事数に比例して処理が遅くなる

ということで、上記の問題点を改善するテンプレートを考えてみました。

2.特定カテゴリに属する記事のコメントを表示する

解決策は、MTEntriesにcategoryモディファイアとrecent_commented_onモディファイアを使って、コメントがつけられた該当カテゴリの記事だけに絞りこみ、その後MTCommentsタグで処理するという方法です。

10コメントを表示する場合、10の記事にそれぞれ1つのコメントがあるパターンと、ひとつの記事で最新10コメントを占めるパターンを考慮して、MTEntriesタグのrecent_commented_onモディファイとMTCommentsタグのlastnモディファイアにそれぞれ「10」を設定します。

<mt:Entries recently_commented_on="10" category="foo">
  <mt:Comments lastn="10">
    <$mt:CommentDate format="%Y%m%d%H%M%S" setvar="date"$>
    <mt:SetVarBlock name="list" key="$date" append="1">
<li><$mt:CommentAuthor$>:<a href="<$mt:CommentLink$>" title="<$mt:EntryTitle$>へのコメント"><$mt:CommentBody remove_html="1" words="15"$></a></li></mt:SetVarBlock>
  </mt:Comments>
</mt:Entries>
 
<mt:loop name="list" sort_by="key reverse">
  <mt:if name="__first__"><ul></mt:if>
  <mt:if name="__counter__" le="10">
    <$mt:var name="__value__"$>
  </mt:if>
  <mt:if name="__last__"></ul></mt:if>
</mt:loop>

最大10×10=100回のループ処理が走ることになりますが、それ以上のコストはかかりません。ただし10以上のコメントを表示したい場合、表示数に比例して再構築のコストがかかるので注意してください。

複数のカテゴリから抽出したい場合はcategoryモディファイアに「OR」を使うといいでしょう。

<mt:Entries recently_commented_on="10" category="foo OR bar">
…後略…

2013.07.19
冗長なテンプレートタグがあったので削除しました。

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


コメントする
greeting

*必須

*必須(非表示)


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

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

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

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