Movable Typeでコメント出力数に応じてコメント番号を制御する方法

Movable Typeでコメント出力数に応じてコメント番号を制御する方法

Posted at June 4,2009 1:55 AM
Tag:[Comment, Customize, MovableType]

Movable Type 4(4.1~)で、コメント出力数に応じてコメント番号を制御するカスタマイズです。

1.概要

例えば、あるブログ記事に投稿された20件のコメントのうち、最新の10件のコメントだけを表示し、さらにコメント番号を付与する場合、次のように MTCommentOrderNumber タグを使ってコメント番号を表示すると、本来のコメント番号は11~20 ですが、この場合もコメント番号は 1~10 で表示されてしまいます。

<mt:Comments sort_order="ascend" lastn="10">
  このコメントは<mt:CommentOrderNumber />番目のコメントです。
  <mt:CommentBody />
</mt:Comments>

本エントリーのカスタマイズを行なうことで、lastn モディファイアや limit モディファイアで絞り込んでも、適正なコメント番号を表示することができます。

なお通常、ブログ記事のコメントはすべて表示する設定になっているのですが、このカスタマイズを何のために使うかという理由を、以下に箇条書きにしておきます。

  • 当ブログでの使用を想定
  • コメントプレビュー画面でこのカスタマイズを使用
  • これまで、コメントプレビュー画面でもすべてのコメントを表示していたが、1000件近くのコメントがあるブログ記事では負荷がかかるので、全コメント表示はやめたい
  • ただしコメントの返信を行なう都合上、コメントプレビュー画面でも、リプライする直近のコメント数件は表示し、コメント番号も確認できるようにしたい

デフォルトテンプレートではコメントプレビュー画面に投稿済みコメントは表示されないので、以下、公開テンプレートを例にカスタマイズを紹介します。

2.コメントを昇順に表示する場合のカスタマイズ

制御タグを駆使して、MTComments タグに lastn モディファイアを使っている場合でも、適正なコメント番号を表示するようにします。

例えば、コメントが5件あり、コメントプレビューで3件だけ表示したい場合、次のようになります。

ブログ記事ページの表示

コメントプレビュー画面の表示

上記の表示を行なうためのサブテンプレートは以下です(最新10件のコメントを表示する設定にしています)。

まず、「コメント」テンプレートモジュールに青色部分を追加します。赤色部分がコメントプレビューテンプレートで表示したい件数になるので、この値を変更すれば表示するコメント数を変更できます。

<mt:ifCommentsActive>
<div id="comments">
 
   <mt:if name="comment_preview_template">
   <mt:include module="コメント入力フォーム" />
   </mt:if>
 
<mt:entryCommentCount setvar="entry_comment_count" />
<mt:if name="comment_preview_template">
  <mt:setVar name="lastn" value="10" />
  <mt:getVar name="lastn" op="--" setvar="counter" />
<mt:else>
  <mt:setVar name="lastn" value="$entry_comment_count" />
</mt:if>
   <mt:comments sort_order="ascend" lastn="$lastn">
 
   <mt:commentsHeader><h3 class="comments-header">コメント<mt:entryCommentCount singular="[1]" plural="[#]" none="[0]" /></h3></mt:commentsHeader>
      <mt:include module="コメント詳細" />
   <mt:commentsFooter></mt:commentsFooter>
   </mt:comments>
 
   <mt:unless name="comment_preview_template">
   <mt:include module="コメント入力フォーム" />
   </mt:unless>
 
</div>
</mt:ifCommentsActive>

次に、「コメント詳細」テンプレートモジュールに青色部分を追加します。このカスタマイズでは「Posted」の前にコメント番号を表示するようにしています。表示位置を変更したい場合は、青色のサブテンプレートを任意の位置に移動してください。

<div class="comment"<mt:ifArchiveTypeEnabled archive_type="Individual"> id="c<mt:commentID />"</mt:ifArchiveTypeEnabled>>
 
   <div class="comment-content">
   <mt:ifCommentParent>
   <p><a href="<mt:commentParent>#comment-<mt:commentID /></mt:commentParent>"><mt:commentParent>No.<mt:commentID />の<mt:commentAuthor /></mt:commentParent></a>さんのコメントへの返信</p>
   </mt:ifCommentParent>
   <mt:commentBody /></div>
 
   <p class="comment-footer">
<mt:if name="comment_preview_template">
  <mt:if name="entry_comment_count" ge="$lastn">
    [ <mt:getVar name="entry_comment_count" op="-" value="$counter" /> ]
  <mt:else>
    <mt:if name="__counter__">
    [ <mt:getVar name="__counter__" /> ]
    </mt:if>
  </mt:if>
  <mt:setVar name="counter" op="--" />
<mt:else>
    [ <mt:getVar name="__counter__" /> ]
</mt:if>
      Posted by <mt:commentAuthorLink default_name="Anonymous" show_email="0" /> <mt:if tag="CommentAuthorIdentity"><mt:commentAuthorIdentity /></mt:if> at <mt:commentDate /><mt:ifCommentsAccepted> | <mt:commentReplyToLink /></mt:ifCommentsAccepted>
   </p>
</div>

カスタマイズは以上です。なお、上記は2つのテンプレートモジュールに設定が分断してしまっていて分かりにくいので、ひとつにまとめてポイントだけに絞り込んだサブテンプレートを以下に示し、解説します。

<mt:entryCommentCount setvar="entry_comment_count" />
<mt:if name="comment_preview_template">
  <mt:setVar name="lastn" value="10" />
  <mt:getVar name="lastn" op="--" setvar="counter" />
<mt:else>
  <mt:setVar name="lastn" value="$entry_comment_count" />
</mt:if>
<mt:comments sort_order="ascend" lastn="$lastn">
  <mt:commentBody />
  <mt:if name="comment_preview_template">
    <mt:if name="entry_comment_count" ge="$lastn">
   [ <mt:getVar name="entry_comment_count" op="-" value="$counter" /> ]
    <mt:else>
      <mt:if name="__counter__">
   [ <mt:getVar name="__counter__" /> ]
      </mt:if>
    </mt:if>
    <mt:setVar name="counter" op="--" />
  <mt:else>
   [ <mt:getVar name="__counter__" /> ]
  </mt:if>
</mt:comments>

サブテンプレートの概要ですが、コメントプレビューテンプレートの場合、変数 lastn に表示したい件数を設定します。また、カウンタ値として、「変数 lastn -1」の値を変数 counter に保持しておきます。それ以外のテンプレート(ブログ記事テンプレート)では、単純に MTEntryCommentCount の値を設定します。

MTComments タグに lastn モディファイアを設定し、値に変数 lastn を利用します。これでブログ記事の場合とコメントプレビューの場合で表示する件数を制御します。

後半に追加したサブテンプレートでコメント番号を出力します。コメントプレビューテンプレートの場合、ブログ記事へのコメント数と変数 lastn の値を比較し、ブログ記事へのコメント数と等しいか、または多い場合は、コメント番号に「ブログ記事へのコメント数 - カウンタ値」を適用します。カウンタ値は繰り返すたびにデクリメントするので、表示するコメント番号は繰り返すたびに大きくなります。

ブログ記事へのコメント数と変数 lastn の値を比較し、ブログ記事へのコメント数が小さい場合は、特殊変数 __counter__ を使用し、コメント番号を1から順番に表示ます。ブログ記事テンプレートの場合も同様です。

なお、コメントプレビュー画面のプレビューコメントにコメント番号を表示しないよう、「<mt:if name="__counter__">」で括っています。

3.降順に表示する場合のカスタマイズ

降順に表示する場合、先頭に表示するコメントのコメント番号は、MTEntryCommentCount タグの値となるので、次のようなサブテンプレートになります。

まず、「コメント」テンプレートモジュールに青色部分を追加します。赤色部分がコメントプレビューテンプレートで表示したい件数になるので、この値を変更すれば表示するコメント数を変更できます。

<mt:ifCommentsActive>
<div id="comments">
 
   <mt:if name="comment_preview_template">
   <mt:include module="コメント入力フォーム" />
   </mt:if>
 
   <mt:entryCommentCount setvar="entry_comment_count" />
   <mt:comments sort_order="descend">
 
   <mt:commentsHeader><h3 class="comments-header">コメント<mt:entryCommentCount singular="[1]" plural="[#]" none="[0]" /></h3></mt:commentsHeader>
      <mt:include module="コメント詳細" />
   <mt:commentsFooter></mt:commentsFooter>
   </mt:comments>
 
   <mt:unless name="comment_preview_template">
   <mt:include module="コメント入力フォーム" />
   </mt:unless>
 
</div>
</mt:ifCommentsActive>

次に、「コメント詳細」テンプレートモジュールに青色部分を追加します。このカスタマイズでは「Posted」の前にコメント番号を表示するようにしています。表示位置を変更したい場合は、青色のサブテンプレートを任意の位置に移動してください。

<div class="comment"<mt:ifArchiveTypeEnabled archive_type="Individual"> id="c<mt:commentID />"</mt:ifArchiveTypeEnabled>>
 
   <div class="comment-content">
   <mt:ifCommentParent>
   <p><a href="<mt:commentParent>#comment-<mt:commentID /></mt:commentParent>"><mt:commentParent>No.<mt:commentID />の<mt:commentAuthor /></mt:commentParent></a>さんのコメントへの返信</p>
   </mt:ifCommentParent>
   <mt:commentBody /></div>
 
   <p class="comment-footer">
[ <mt:getVar name="entry_comment_count" /> ]
<mt:setVar name="entry_comment_count" op="--" />
      Posted by <mt:commentAuthorLink default_name="Anonymous" show_email="0" /> <mt:if tag="CommentAuthorIdentity"><mt:commentAuthorIdentity /></mt:if> at <mt:commentDate /><mt:ifCommentsAccepted> | <mt:commentReplyToLink /></mt:ifCommentsAccepted>
   </p>
</div>

降順に表示する場合のカスタマイズは、「コメント番号を降順で表示する」の2項と全く同じです。降順に出力する場合は、最初に表示するコメントのコメント番号は MTEntryCommentCount タグの値と等しくなります。

以上です。
これらのサブテンプレートは、コメントプレビューの判定等を外し、少し書き換えることで、ブログ記事テンプレートでの利用も可能です。

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


コメント

こんにちは、こちらのテンプレートとカスタマイズ等を参考にブログを作っています。

コメントのテンプレートモジュールでトラブルが起きて大変困っています。

ブログをはじめに作った際に、コメントやトラックバック等のテンプレートモジュールを削除してブログを作りました。

今回、コメント欄を作ろうとテンプレートモジュールを作って、アーカイブテンプレートのブログ記事に、include moduleをしたのですが、表示されません。再構築を何度かしましたが反映されていません。

また、『ブログ記事のメタデータ』のテンプレートモジュールで、コメント数が表示されるようにしましたが、同じように表示されません。

他のブログではコメント欄やコメント数は表示されますが、肝心の表示したいブログで表示されなくて困っています。

一度削除してしまったことを後悔しているのですが、このままブログにコメントをつけて続けたいのでお時間ございましたらアドバイスをお願いします。

[1] Posted by Hikaru : August 6, 2009 11:55 AM

>Hikaruさん
こんばんは。
ご質問の件ですが、とりあえず「ブログの新規作成」で別のブログを新しくひとつ作り、そのブログで当サイトのテンプレートセットを適用してください。新しく作ったブログは、テンプレートの内容を参照するためだけに作ります。

そのあと、新しく作ったブログの管理画面の「デザイン」→「テンプレート」から必要なテンプレートモジュールをコピーし、元のブログのテンプレートモジュールとして新しく作り、コピーしたテンプレートの内容をペーストして使ってみてください。
また、インクルードの方法が分からない場合は、新しく作ったブログのテンプレートと見比べてみてください。

頂いた文言では困り具合が分かりませんのがとりあえずの回答です。
それではよろしくお願い致します。

[2] Posted by yujiro logo : August 11, 2009 11:57 PM

>チャーンさん
こんばんは。
ご連絡ありがとうございました。
ご質問の件、無事に解決されたようでよかったです。
また、頂いたコメントはご要望通り削除致しました。
ではでは。

[3] Posted by yujiro logo : December 7, 2009 11:53 PM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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