アーカイブページに「最近のコメント」「最近のトラックバック」を表示する

アーカイブページに「最近のコメント」「最近のトラックバック」を表示する

Posted at March 29,2006 2:16 AM
Tag:[Customize, MovableType, Sidebar]

「カテゴリー・アーカイブページや月別アーカイブページで『最近のコメント』『最近のトラックバック』が正常に表示されません」という質問を時々頂くことがあります。

質問の通り、例えばこのサイトのトップページにある「最近のエントリー」「最近のコメント」「最近のトラックバック」のテンプレートをそのままアーカイブページに貼り付けても、ユーザーが期待する表示にはなりません。これはリスト表示に使われるMTタグ(MTEntries等)がアーカイブの属性に依存した振る舞いをするのが原因と思われます(下記の調査ではそうでもない結果になっていますが)。

これは不具合ではなく、Movable Type の仕様、あるいは制限事項と思って頂いて良いと思いますが、見落としていなければユーザーマニュアルには明示的な記述はありません。したがってこれらのリスト類がどのように表示されるか、実際に設定してみないと分からない訳です。

ということで、トップページに設定しているリストを各アーカイブページに設定した場合の結果と、それらを回避する方法について記します。

1.MTタグをアーカイブテンプレートに設定した場合の結果

公開テンプレートを例に、メインページに設定してある「最近のエントリー」「最近のコメント」「最近のトラックバック」と同じMTタグを各アーカイブページに設定した場合の表示がどのようになるかを、下記の一覧にまとめました。

 カテゴリー・アーカイブ月別アーカイブエントリー・アーカイブ
最近の
エントリー
該当カテゴリーのエントリー一覧該当月のエントリー一覧トップページと同様
最近の
コメント
[MTEntries recently_commented_on指定]
該当カテゴリーの全エントリーのコメントをMTCommentsのlastn分表示
[MTEntries lastn指定]
コメントのないエントリー含めlastn分表示
[MTEntries recently_commented_on指定]
該当月の全エントリー・コメントをMTCommentsのlastn分表示
[MTEntries lastn指定]
該当月のコメントのないエントリー含めlastn分表示
トップページと同様
最近の
トラックバック
表示されないトップページと同様該当エントリーのトラックバック一覧

2.アーカイブページで正常に表示する方法

次にアーカイブページで「最近のエントリー」「最近のコメント」「最近のトラックバック」を表示する方法を記します。

2.1 プラグインを利用する

MTCollate プラグインを利用すればカテゴリー・アーカイブ/月別アーカイブで正常に表示されるようです。設定方法はMTCollate を使って「最近のコメント」を表示するに記しています。ただしエントリー・アーカイブでは該当エントリーだけが対象になるようです。

もうひとつは Recents プラグインを利用します。

The blog of H.Fujimoto最近のコメント/トラックバックをエントリーとともに表示するプラグイン

本プラグインであれば各アーカイブページで正常に動作します。いずれも MTCommentsRecent タグに mode="force" を付与することを忘れないでください。

2.2 モジュール化する

リスト表示用タグをアーカイブテンプレートに直接貼り付けると冒頭の問題が発生しますが、リスト自体を独立したモジュール(部品)として登録すれば解消されます。
以下、インデックステンプレートに「最近のコメント」を登録して、それをアーカイブページから読み込む方法を紹介します。

2.2.1 モジュール用テンプレートの作成

管理画面の「テンプレート」をクリック→右上の「テンプレートを新規作成」をクリック。次画面で下記を設定します。

テンプレート名:最近のコメント
出力ファイル名:recentComments.html
インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する:チェック
テンプレートの内容:下記(ここでは公開テンプレートのタグを流用しています)
<div class="sidetitle">
Recent Comments
</div>
 
<div class="side">
<MTEntries recently_commented_on="5">
<a href="<$MTEntryLink$>"><MTEntryTitle></a>
<br />
<MTComments lastn="5">
└ <a href="<$MTEntryLink$>#c<$MTCommentID$>" title="c<$MTCommentID$>">
<MTCommentAuthor></a> <$MTCommentDate format="%m/%d"$><br />
</MTComments>
</MTEntries>
</div>

設定が完了したら保存・再構築してください。これで「最近のコメント」だけを表示するためのページが index.html と同じディレクトリにできあがります。ファイル名の拡張子は .html にしていますが、.txt 等なんでも結構です。

2.2.2 アーカイブテンプレートの修正

アーカイブテンプレートの編集画面に進み、2.2.1項で作った「最近のコメント」を表示する設定を行います。
A/B/Cのいずれかを選択してください。

A.MTInclude タグでインクルードする
B.PHPでインクルードする
C.JavaScriptでインクルードする

違いは、Aは再構築を契機に「最近のコメント」を取得するのでスタティックページと同じ効果(=次に再構築が実行されるまで最近のコメントが更新されない)ですが設定が手軽に行えます。
Bはページビューを契機に「最近のコメント」取得します。「最近のコメント」はコメントが投稿されるたびに更新されるので、常に最新情報が反映されるというメリットがあります。ただしPHP化する必要がある・PHPがインストールされている必要がある等の条件があります。
CはA・Bの長所をもっています。

A.MTInclude タグを利用する

「最近のコメント」を表示したい場所に下記のタグを追加して、保存・再構築します。

<$MTInclude file="recentComments.html"$>
B.PHPを利用する

「最近のコメント」を表示したい場所に下記のタグを追加して、保存・再構築します。

<? readfile('<$MTBlogURL$>recentComments.html')?>

Bの場合、はタグを記述するテンプレートの拡張子が .php であることが前提となります。また、1行目にXML宣言

<?xml version="1.0" encoding="<$MTPublishCharset$>"?>

が記述されている場合は

<? echo('<?xml version="1.0" encoding="<$MTPublishCharset$>"?>') ?>

に変更してください。さらにアーカイブページのファイル(index.html)が残っていると、リンクをクリックした場合に .html ファイルを優先してアクセスする可能性があるため、全アーカイブページを一旦削除してから再構築されることを推奨します。

C.JavaScript を利用する

手順が前後してすいませんが、2.2.1の内容は下記に変更してください。

テンプレート名:最近のコメント
出力ファイル名:recentComments.js
インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する:チェック
テンプレートの内容:下記(ここでは公開テンプレートのタグを流用しています)
document.write('<div class="sidetitle">');
document.write('Recent Comments');
document.write('</div>');
 
document.write('<div class="side">');
<MTEntries recently_commented_on="5">
document.write('<a href="<$MTEntryLink$>"><MTEntryTitle encode_js="1"></a>');
document.write('<br />');
<MTComments lastn="5">
document.write('└ <a href="<$MTEntryLink$>#c<$MTCommentID$>" title="c<$MTCommentID$>">');
document.write('<MTCommentAuthor encode_js="1"></a> <$MTCommentDate format="%m/%d"$><br />');
</MTComments>
</MTEntries>
document.write('</div>');

そしてアーカイブテンプレートの「最近のコメント」を表示したい場所に下記のタグを追加して、保存・再構築します。

<script type="text/javascript" src="<$MTBlogURL$>recentComments.js"></script>

以上です。
「最近のエントリー」や「最近のトラックバック」も同様の手順で作成すればOKです。

3.まとめ

個人的にはモジュール化による表示を推奨します。理由はリストの修正・管理が容易になり、再構築のパフォーマンスも向上するためです。「最近のエントリー」「最近のコメント」「最近のトラックバック」を全アーカイブページ分生成することと、3ファイルだけを生成することを比較すれば、どちらが速いか感覚的にお分かりになると思います。先のプラグインと組み合わせればさらにきめこまかい表示の設定が可能になります。
トップページ等のインデックステンプレートのリスト類も同様の手法でインクルードすると良いでしょう。

最初の設定がやや手間取るかもしれませんが興味のある方はお試しください。なお当サイトでは全てのリストについてPHPモジュール化を行っています。

関連記事
トラックバックURL


トラックバック

アーカイブのページ分割 from No.302
またまたMTブログネタだけど、やっとアーカイブのページ分割が出来た。 分割したの... [続きを読む]

Tracked on June 5, 2006 10:20 PM

コメントを正常に表示 from deux mers
カテゴリーアーカイブや、日付アーカイブでは最新のコメントが変に表示されます。 コ... [続きを読む]

Tracked on September 6, 2006 11:04 AM

「最近のコメント」と「最近のトラックバック」をモジュール化 from WONDER FROM MY NEST!
Movable Typeの標準テンプレートでは、メインページ(index.html)にも「最近のコメント」と「最近のトラックバック」は表示されないけれど、... [続きを読む]

Tracked on February 6, 2007 3:08 PM

MTのカテゴリアーカイブで最新のエントリー一覧が全て表示されない件 from TPLH.weblog
公私ともにMTに関わる機会が多い。今仕事でそのMTに関して問い合わせが来ており... [続きを読む]

Tracked on February 28, 2007 12:17 AM

MT:カテゴリーアーカイブなどでの最近のコメントやトラックバックの表示について from kubolog - クボログ -
各アーカイブページの、 サイドバーのコメント・トラックバックが最近の記事と同様、... [続きを読む]

Tracked on March 26, 2007 1:40 AM
コメント

yujiroさん、こんにちは。
今回このカスタマイズをしてみたのですが、

<? readfile('<$MTBlogURL$>recentComments.html')?>

<?php readfile('<$MTBlogURL$>recentComments.html')?>

ではないでしょうか?


カスタマイズは成功しました。ありがとうございました。

[1] Posted by pokelabo : March 29, 2006 9:27 AM

>pokelaboさん
こんばんは。
ご質問の件について、PHPでは短縮型もサポートされています。が、推奨ではないようですのでリストは変更しておきました。
情報ありがとうございます。

[2] Posted by yujiro : March 30, 2006 12:20 AM

なるほど・・・省略もできるんですね。勉強になりました。

[3] Posted by pokelabo : March 30, 2006 7:20 AM

毎回のことなんですけど、レガシー過ぎてSSIでのINCLUDEは話題に出ないんですねぇ……

うちんとこはPHPで細かい制御を行う必要も無いのでSSIで済ませてますです。

[4] Posted by ちは : May 19, 2006 7:38 PM

>ちはさん
こんばんは。
たしかに、その手もありましたね。

[5] Posted by yujiro : May 20, 2006 10:40 PM

なるほどー!そうだったのか!

[6] Posted by tac : June 7, 2008 8:20 PM

>tacさん
そういうことです!

[7] Posted by yujiro logo : June 9, 2008 10:54 AM

最近MT4.2を使い始めまして、
早速[B]の方法できちんとサイドバーのエントリー・コメント表示されました!
ありがとうございます。

ただ、検索結果のページでreadfileで読み込まれるはずのエントリーやコメント達が読み込まれないのです、、、。
表示させる方法はあるのでしょうか、、、。

お手透きなときにでもアドバイスを頂ければ幸いです。

[8] Posted by シミズモータース : October 31, 2008 6:16 AM

>シミズモータースさん
こんにちは。
ご質問の件ですが、検索結果ページはPHPとして動作できません。したがって、「最近のブログ記事」ウィジェットおよび「最近のコメント」ウィジェットを作り、下記の内容を追加して貼り付けてください(ウィジェットではなく、<readfile …> を記述している直前直後あたりに直接追加してもOKです)。
赤字部分は適宜修正してください。

「最近のブログ記事」ウィジェット

<mt:if name="search_results">
<mt:blogSitePath cat="「最近のエントリー」の出力ファイル名" setvar="recent_entries" />
<mt:include file="$recent_entries" />
</mt:if>

「最近のコメント」ウィジェット

<mt:if name="search_results">
<mt:blogSitePath cat="「最近のコメント」の出力ファイル名" setvar="recent_comments" />
<mt:include file="$recent_comments" />
</mt:if>

ウィジェットとして作った場合は、ウィジェットセット画面で、現在の「最近のブログ記事」「最近のコメント」が表示されているあたりに配置してください。

それではよろしくお願い致します。

[9] Posted by yujiro logo : October 31, 2008 1:55 PM

>yujiroさん

す、すごい!
きちんと表示されました!
ありがとうございます!

これからも色々と参考にさせていただきます。
よろしくお願い致します。

[10] Posted by シミズモータース : October 31, 2008 4:07 PM

>シミズモータースさん
こんばんは。
ご連絡ありがとうございました。
うまくできたようでよかったです。
ではでは!

[11] Posted by yujiro logo : October 31, 2008 8:42 PM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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