少し前に「最近のトラックバック(3) エントリーごとにまとめて表示」というのをやりましたが、トラバのついた記事を全件ループさせた後、<MTLoop>の並び替えでまた全件ループさせ、さらに<MTFor>でまわすということをしていたため、さすがにちょっと重いかも…な感じでした。
そこでいったんは挫折した<MTPingEntry>を使ってもう少し軽く出来ないかと再トライ。<MTPingEntry>のネックはトラックバックに属する記事という仕様上、複数のトラバが同じ記事にあった場合、トラバの数だけエントリ記事が重複して表示されてしまうことです。ならば既に表示済みの記事に何らかの目印をつけて、一度登場した記事は除外して表示させることは出来ないのか? 頭をひねり倒して(^^;やってみました。以下の条件を満たすように組んであります。
- エントリー(ブログ記事)ごとにその記事に属するトラックバックの一覧をまとめて表示。
- ブログ記事の重複はない。
- 記事はトラバ新着順に表示。 最新のトラックバックがあった記事が常にトップに出る。
タグの見本は以下。赤字の数字で表示したい記事数を指定します。青字の数字で記事に属するトラバ表示数を指定します。<MTPingEntry>の標準的な使い方に準じてますので、HTML部分の見通しもよくて編集しやすいかと思います。
<MTSetVar name="pingecount" value="0"> <MTPings sort_order="descend"> <MTPingsHeader><dl></MTPingsHeader> <MTIf name="pingecount" lt="5"> <MTPingEntry> <MTSetVarBlock name="thiseid">-<$MTEntryID$>-</MTSetVarBlock> <MTUnless name="pingid" like="$thiseid"> <MTSetVar name="pingecount" op="++"> <dt><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></dt> <MTPings lastn="5"> <dd><a href="<$MTPingURL$>" title="<$MTPingTitle$>"><$MTPingBlogName$></a> <$MTPingDate format="%y/%m/%d"$></dd> </MTPings> </MTUnless> <MTSetVarBlock name="pingid"><MTGetVar name="pingid"><MTGetVar name="thiseid"></MTSetVarBlock> </MTPingEntry> </MTIf> <MTPingsFooter></dl></MTPingsFooter> </MTPings>
説明。
まずは記事のIDを求め、pingidという変数に記事IDが含まれている場合は除外、含まれていない場合は表示するという仕組みになってます。下部の<MTSetVarBlock name="pingid">~でpingid変数には表示が1回終わる度に記事IDが追加されていくという形になってます。つまり「既に表示済み」の記事IDがpingid変数に蓄積されていくので、そこになければ「まだ登場していない記事」と判断しているわけです。
*記事IDは数字なので、そのまま蓄積されたのでは数字の羅列になって判別不能になります。それを避けるため全角の()で囲ってIDの前後に-(ハイフン)をつけて判別の区切りにしています。
表示数はpingecountでカウント・制御してますが、カウント数が指定した数に達したら処理が終わるようにしているので、こちらの方法よりは軽くなってるんじゃないかと思います。実用性もまあまあかなと。
発想次第でもっといい方法もあるような気はしますが、とりあえずはこれで現状満足いく出来になったかなと。
<追記>
「最近のトラックバックだけをエントリーごとにまとめて表示」するように修正しました。
今は修正版の方へ移行しています。(2008.8.20)
<2008.8.23 修正>記事ID識別記号を全角から半角へ変更。