Movable Typeで特定カテゴリのコメントを表示する方法
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
冗長なテンプレートタグがあったので削除しました。
- Movable Typeのコメント完了ページの内容を記事ごとに振り分ける方法
- Movable TypeでreCaptchaを利用する
- Movable Typeでカテゴリ別+ブログ記事別に新着コメントを表示する
- Movable Type 5でコメント投稿フォームをポップアップする
- Movable TypeのコメントでFacebookアカウント認証を有効にする
- Yahoo! JAPAN OpenID を省略表示する(その2)
- コメントにHTMLタグ挿入ボタンをつける(MT4/MT5版)
- コメント投稿にTwitterのOAuth認証を導入
- Movable Type 5でのMTCommentsタグの動作
- ブログ記事とコメントをひとつのフィードで配信する
- Movable Typeのコメント一覧からウェブページのコメントを除外して表示する
- Movable Typeのコメントにimg要素を許容する
- Movable Type(MT)のコメント投稿者の承認と禁止について
- Movable Type 5(MT5)のコメントのページ分割機能(その2:カスタマイズ)
- Movable Type 5 のコメントのページ分割機能(その1:概要)