最近のトラックバックをエントリごとにまとめて表示
最近のコメントをエントリごとにまとめて表示するのは、MTEntriesのrecently_commented_onオプションを使うことで簡単に実現できるのですが、トラックバックだとそうはいきません。このエントリでは、最近のトラックバックをエントリごとにまとめて表示する方法を説明します。
ここで説明する方法は、エントリの表示方法をMTEntryIDに基づいた順番だけでなく、最近トラックバックを受け取った順番(recently_commented_onに類似した順番と考えてください)などにカスタマイズ可能です。
· 編集過程でテンプレートにバグが入り込んでいましたので修正しました。(2004/12/06)
徒波さんのエントリがとても参考になりました。
徒波 | MT の Recent TrackBack で連続したトラックバックをヘッダー化する方法 [要Plugin : MTCollate , MTPingedEntry]
用意するもの
- MTCollate Plugin (MT Extensions: MTCollate 1.1)
- MTPingEntry Plugin (hirata's techknow MT: つづきを書く前に...)
どちらもプラグインファイルを<MTDIR>/pluginsにコピーするだけで使えます。MTPingEntryの方は以下のパッチを当てておくことお勧めします。理由はこのエントリの下の方に書いてあります。意味が分からなければ当てなくても構いません。下で説明するテンプレートはこのパッチを当てなくても動作するようにはしてあります。
--- PingEntry.pl.bak 2004-10-03 01:46:21.000000000 +0900
+++ PingEntry.pl 2004-12-02 20:22:40.653448144 +0900
@@ -19,6 +19,7 @@
$ctx->stash('entry', $entry);
$out = $builder->build($ctx, $tokens, $cond);
$ctx->stash('entry', $saved_stash);
+ $ctx->stash('ping', $ping);
return $ctx->error($builder->errstr) unless defined $out;
return $out;
}
テンプレートの記述
<MTCollateCollect> <MTPings lastn="10"> <MTCollateRecord> <MTCollateSetField name="ping_id"><$MTPingID$></MTCollateSetField> <MTCollateSetField name="ping_url"><$MTPingURL$></MTCollateSetField> <MTCollateSetField name="ping_title"><$MTPingTitle$></MTCollateSetField> <MTCollateSetField name="ping_blog_name"><$MTPingBlogName$></MTCollateSetField> <MTCollateSetField name="ping_date"><$MTPingDate format="%y.%m.%d"$></MTCollateSetField> <MTPingEntry> <MTCollateSetField name="entry_key"> <$MTEntryID$> </MTCollateSetField> <MTCollateSetField name="entry_link"><$MTEntryLink$></MTCollateSetField> <MTCollateSetField name="entry_title"><$MTEntryTitle$></MTCollateSetField> </MTPingEntry> </MTCollateRecord> </MTPings> </MTCollateCollect> <dl> <MTCollateList sort="entry_key:#:- ping_id:#:+"> <MTCollateIfHeader name="entry_key"> <dt><a href="<$MTCollateField name="entry_link"$>" title="<$MTCollateField name="entry_title" encode_html="1"$>"><$MTCollateField name="entry_title"$></a></dt> </MTCollateIfHeader> <dd><a href="<$MTCollateField name="ping_url"$>" title="<$MTCollateField name="ping_title" encode_html="1"$>"><$MTCollateField name="ping_date"$> <$MTCollateField name="ping_blog_name"$></a></dd> </MTCollateList> </dl>
カスタマイズ
- 表示したいトラックバックの件数を変更するには、以下の部分を変更します。
<MTPings lastn="10">
- エントリの表示順を降順(新しいものが上)から昇順(古いものが上)に変更したい場合には以下のように変更します。
<MTCollateList sort="entry_key:#:+ ping_id:#:+">
- エントリごとのトラックバックの表示順を昇順(古いものが上)から降順(新しいものが上)に変更したい場合には以下のように変更します。
<MTCollateList sort="entry_key:#:- ping_id:#:-">
- エントリの表示方法を最近トラックバックを受け取った順番(recently_commented_onに類似した順番と考えてください)にするには、以下のように変更します。
<MTCollateSetField name="entry_key">
ここでやっているのは、簡単に言うとMTEntryIDの代わりに、エントリに投げられた最新のトラックバックの時刻情報(例:20041202175000)をソート用のキーとして使うということです。<$MTEntryID$><MTPings lastn="1"><$MTPingDate format="%y%m%d%H%M%S"$></MTPings> </MTCollateSetField>
補足説明
一色さんのMTPingedEntryを使っている人が多いと思うのですが、MTPingedEntryではトラックバックされたエントリに関する情報としてPermalinkとTitleしか利用できません。一方、平田さんのMTPingEntryでは、大抵のMTEntryXXXタグが使えるので柔軟なカスタマイズが可能です。おかげでMTEntryIDやMTEntryDateを基準にソートすることもできます。さらに 4. で示したように、MTPingsコンテナの中のMTPingEntryコンテナの中でMTPingsコンテナを呼び出すというトリッキーな方法を使えば、そのエントリに投げられた最新のトラックバックの時刻情報を取得して、それを基準にソートするもできます。
ただし、オリジナルのPingEntry.plを使う場合この方法は順番がとても重要です。下のように内側のMTPingsを先に使うと、外側のMTPingsのコンテキストを破壊してしまい、後でMTPingID、MTPingURLなどが正常に取り出せなくなります。上の方で載せたPingEntry.plへのパッチはこの不具合を解決するものです。
<MTCollateCollect> <MTPings lastn="10"> <MTCollateRecord> <MTPingEntry> <MTCollateSetField name="entry_key"> <MTPings lastn="1"><$MTPingDate format="%y%m%d%H%M%S"$></MTPings> </MTCollateSetField> ... </MTPingEntry> <MTCollateSetField name="ping_id"><$MTPingID$></MTCollateSetField> <MTCollateSetField name="ping_url"><$MTPingURL$></MTCollateSetField> ... </MTCollateRecord> </MTPings> </MTCollateCollect>
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/211
こんばんは、いつもお世話になっています。こちらのソースを参考にさせていただきました。
2 点ソースコードにミスと思われる点があったので報告いたします。
「テンプレートの記述」の最後から 2 行目の最後、 </dd> と書くべきところが <dd> になっているようです。
また、「カスタマイズ」の 4. の部分ですが、 <MTCollateSetField name="entry_id"> ではなく <MTCollateSetField name="entry_key"> だと思います。
※修正後はこのコメントを消去して下さって構いません。
あーなんか中途半端に書き換えたのでおかしくなってしまったみたいですね。
直しておきました。ご指摘ありがとうございます。
こんにちは。サイトへのコメントありがとうございました。
Argument "\n" isn't numeric in numeric comparison・・・・
のエラーについて、「entry_keyを定義する部分で余分な空行が入っているから」とのことですが、該当箇所がわからないのです。
(o)さんの記事通りに、
<$MTEntryID$>
の行を
<MTPings lastn="1"><$MTPingDate format="%y%m%d%H%M%S"$></MTPings>
に変更するとでます。また、元に戻すとエラーはなくなります。
<MTCollateSetField name="entry_key"><MTPings lastn="1"><$MTPingDate format="%y%m%d%H%M%S"$></MTPings><MTCollateSetField>
と、改行をなくして1行にするとエラーメッセージが少し変わって
Argument "" isn't numeric in numeric comparison・・・・
となるのです。
何かおわかりでしたら、アドバイスお願いします。
うわーなんででしょう。さっぱり分かりません。warning自体は、MTCollateListのオプションをsort="entry_key:- ping_id:#:+"のようにして文字列比較にすれば抑えられるのではないかなと思います。
しかし、MTPingEntryの中のMTPingsでMTPingDateを呼び出したときに日時が取得できない場合があるわけですよね。それでいて期待したとおりに動くのはなぜなんでしょうね。
オプション変えてみましたが、一緒でした・・・。淡い期待をこめてパッチも当ててみましたが、変わらず。
3つめのTBのMT hxxksさん公開のコードで試してみても、同じでした。このとき気づいたのですが、インデックステンプレートを保存した後や、エントリーを保存したあとに表示される再構築ボタンから再構築したときはでません。
エラーがでるのは、管理画面左サイドの下から2つめの「サイトの再構築」をしたときです。インデックスを再構築すると、再構築までおわって、「閉じる」「もう一度再構築する」ボタンが表示されたその下に表示されます。行数は8、トラックバックの個数ともトラックバックされたエントリーの数とも合っておらず、謎です。
しばらくこのまま動かしてみますね。
はじめまして。
最近トラックバックがあったエントリーを順に出力する「MTEntriesRecentlyPinged」というプラグインを作ってみました。
こちらで紹介されている方法よりも、もっとシンプルに使うことができますので、良かったらご覧ください。
http://www.h-fj.com/blog/archives/2005/01/post_22.php
GJ!! 理想を言えば、MTEntriesへのオプションとして与えたいところですが、プラグインではできないんですよね(プラグインで_hdlr_entriesを上書きしない限り)。
あと、アーカイブのコンテキストを考慮したり、daysオプションが指定できるとよいですね。
こんにちは。
>MTEntriesへのオプションとして与えたいところですが、プラグインではできないんですよね
既存のテンプレートタグを拡張するようなフックポイントはないようですので、それはできないと思います。
>あと、アーカイブのコンテキストを考慮したり、daysオプションが指定できるとよいですね。
それは今後の課題ということで・・・(笑)。
SQLを直にたたければ楽にできると思いますが、プラグインだとそのあたりが難しいので、工夫しないと難しそうです。
ちなみに、当方のBlogではダイナミックパブリッシングを使っていますが、そちらではSQLを直接発行して、MTEntriesRecentlyPingedプラグインと同じことをしています。
ダイナミックパブリッシングに関して言えば、SQLを直接叩くのは美しくないですね。ベースシステムに妥当な拡張を提案して、それを採用してもらえるようにSAに働きかけた方が建設的だと思います。特にmtdb_base.phpは既存のタグを実装するには十分だけれども機能不足な点が多々ありますから。
私もこのブログや英語版ブログで修正情報を公開したり、SAのBug Tracking Systemに投稿したりしてSAの開発者に伝えるようにしています。分かってくれない相手ではないですよ。
あ、ちょっと考えたらMTEntriesのオプションにrecently_pinged_onを追加するのってプラグインでできるじゃん。
参考になりました。早速導入しました。ありがとうございました!!