Dec 2, 2004

最近のトラックバックをエントリごとにまとめて表示

最近のコメントをエントリごとにまとめて表示するのは、MTEntriesのrecently_commented_onオプションを使うことで簡単に実現できるのですが、トラックバックだとそうはいきません。このエントリでは、最近のトラックバックをエントリごとにまとめて表示する方法を説明します。

ここで説明する方法は、エントリの表示方法をMTEntryIDに基づいた順番だけでなく、最近トラックバックを受け取った順番(recently_commented_onに類似した順番と考えてください)などにカスタマイズ可能です。

· MTCollate Plugin、MTPingEntry PluginがPerl版しかないのでスタティック・ページにしか適用できません。
· 編集過程でテンプレートにバグが入り込んでいましたので修正しました。(2004/12/06)

徒波さんのエントリがとても参考になりました。

徒波 | MT の Recent TrackBack で連続したトラックバックをヘッダー化する方法 [要Plugin : MTCollate , MTPingedEntry]

用意するもの

どちらもプラグインファイルを<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>

カスタマイズ

  1. 表示したいトラックバックの件数を変更するには、以下の部分を変更します。
    <MTPings lastn="10">
    
  2. エントリの表示順を降順(新しいものが上)から昇順(古いものが上)に変更したい場合には以下のように変更します。
    <MTCollateList sort="entry_key:#:+ ping_id:#:+">
    
  3. エントリごとのトラックバックの表示順を昇順(古いものが上)から降順(新しいものが上)に変更したい場合には以下のように変更します。
    <MTCollateList sort="entry_key:#:- ping_id:#:-">
    
  4. エントリの表示方法を最近トラックバックを受け取った順番(recently_commented_onに類似した順番と考えてください)にするには、以下のように変更します。
    <MTCollateSetField name="entry_key">
    <$MTEntryID$>
    <MTPings lastn="1"><$MTPingDate format="%y%m%d%H%M%S"$></MTPings>
    </MTCollateSetField>
    
    ここでやっているのは、簡単に言うとMTEntryIDの代わりに、エントリに投げられた最新のトラックバックの時刻情報(例:20041202175000)をソート用のキーとして使うということです。

補足説明

一色さんの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>

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com