top

最近のトラックバック(3) エントリーごとにまとめて表示(MT4~)

これまで最近のトラックバック表示にはRecently pinged on Pluginを使ってきましたが、このプラグインを使わず標準のMTタグだけで同じことが出来るようにしてみました。

実は先日、Movable Typeテンプレートタグ虎の巻を見ていて<MTPingEntry>タグを発見したのがことの始まり。これはMT4から実装された新しいタグで、<MTPings>の中でMTEntries関連のタグが使えるようになります。それでさっそくこれを使って「最近のトラックバックをエントリー毎にまとめて表示」をやってみて出来た…つもりでいたのですが、思わぬ落とし穴があったことが判明。記事が重複してしまうのです。どうもこのタグは<MTPings>内で使われる仕様上、「記事ごとにまとめて表示」には使えないようです。

■最近のトラックバックを記事ごとにまとめて表示(4.1~)
ということで<MTPingEntry>タグはやめて、少し複雑になるけど<MTEntries>内から<MTPings>の情報を取得する方法に仕切り直して全面書き直しました。この場合、問題はどうやってブログ記事をトラックバックの日付順で並び変えるかということ。いろいろ頭をひねって、なんとかやってみました。以下の条件を満たすように組んであります。

  • エントリー(ブログ記事)ごとにその記事に属するトラックバックの一覧をまとめて表示。
  • ブログ記事の重複はない。
  • 記事は新しいトラックバック順でソート。最新のトラックバックがあった記事が常にトップに出る。

タグの見本は以下。赤字の部分で表示する記事数を決めます。表示したい数より1つ少なく指定します(5つ表示したい場合は4とする)。記事に属するトラックバック数は青字の部分で指定します。サンプルは定義リストでマークしてあるので必要に応じて調整を。<MTFor>を使ってますので4.1以上用です。

<MTEntries lastn="0">
<MTIfNonZero tag="EntryTrackbackCount">
<MTSetVarBlock name="eptitle"><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></MTSetVarBlock>
<MTSetVarBlock name="eping"><MTPings lastn="5"><a href="<$MTPingURL$>" title="<$MTPingTitle$>"><$MTPingBlogName$></a> <$MTPingDate format="%y/%m/%d"$><br /></MTPings></MTSetVarBlock>
<MTSetVarBlock name="epinglist"><dt><MTGetVar name="eptitle"></dt><dd><MTGetVar name="eping"></dd></MTSetVarBlock>
<MTSetVarBlock name="newping"><MTPings lastn="1"><MTPingDate format="%Y%m%d%H%M%S"></MTPings></MTSetVarBlock>
<MTSethashVar name="newpinglist">
<MTSetVar name="$newping" value="$epinglist">
</MTSethashVar>
</MTIfNonZero>
</MTEntries>

<MTLoop name="newpinglist" sort_by="key reverse">
<MTSetVarBlock name="push(sortpinglist)"><$MTVar name="__value__"$></MTSetVarBlock>
</MTLoop>

<dl>
<MTFor var="i" from="0" to="4">
<$MTVar name="sortpinglist" index="$i"$>
</MTFor>
</dl>

最初の<MTEntries>内で記事とトラックバックの情報を取得してハッシュ変数に入れています。
<MTSetVarBlock name="eptitle">でトラバされたブログ記事を取得してます。
<MTSetVarBlock name="eping">で記事に属するトラックバックの一覧を取得してます。
<MTSetVarBlock name="epinglist">で取得したデータを連結してマークアップしてます。
テンプレの見通しをよくしたいならもっと細かく分けてもいいし、<MTSetVarBlock name="epinglist">に一度に全部突っ込んでしまってもいいです。その辺はお好みで。
<MTSetVarBlock name="newping">でトラバ一覧の最新の日時を取得してます。これが並び替えのキーになっています。
<MTSethashVar name="newpinglist">で以上の情報をハッシュ変数に入れてます。

<MTLoop>でトラックバックの日時(緑字で取得した日時)で記事を並び変えています。
ソートされた記事を<MTFor>で指定した記事数だけ表示されるようにしてます。

☆もっとシンプルにしたいところですが、それでもプラグイン使わなくてもMTタグだけで同じことが出来るのはやっぱりいいですね。MT標準タグなのでもちろんダイナミックでも問題なく表示できます。これで静的でしか使えなかったRecently pinged on Pluginと同じことがダイナミックでも出来るようになりました。今はこちらに切り替えてお試し中です(改訂版作りましたのでこちらに変更しました)。

■追記:最近のトラックバックと記事を表示(4.0~)
せっかくなので、<MTPingEntry>タグを使ったトラバ記事表示例も書いておきます。こちらは記事ごとにトラバをまとめることはできませんが、どの記事に届いたトラックバックなのかを表示することは出来ます。

<MTPings lastn="10">
<MTPingsHeader><ul></MTPingsHeader>
<li>
<MTPingEntry>
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
</MTPingEntry>
 └<a href="<$MTPingURL$>" title="<$MTPingTitle$>"><$MTPingBlogName$></a> <$MTPingDate format="%y/%m/%d"$>
</li>
<MTPingsFooter></ul></MTPingsFooter>
</MTPings>

こちらの利点は「まとめて表示版」よりずっと軽いってことでしょうか。シンプル志向で再構築速くしたい派ならこれでも十分かも。1つのトラバに1つの記事、というパターンになるので、表示件数は多めでもいいかと。使い勝手はPingedEntryプラグインとほぼ同じです。(というか、ほとんどそのものでは…)。PingedEntryプラグインと同じことをダイナミックでやりたい場合などによいと思います。

<2008.6.27> 全面書き直し&修正^^;
<2008.7.2> MTPingEntryタグでも同じことが出来る方法を追加しました。
最近のトラックバック(4) エントリーごとにまとめて表示・改(4.1~)

 

コメント

いつも参考にさせていただています。

自分もようやくMT4の扱いにちょっとずつ慣れてきました。
頭でソースを設計しつつ、いろいろとタグを組み合わせて望みの形で生成されることがちょっと楽しくなってきたところです。
ちょっと?な事があり、記事の趣旨とは異なりますが、質問させてください。
4.1から加わったMTForとMTLoopについてです。
いろいろ調べてはいるものの、こういうときに便利ですとか、使い方の例などがあまり無く、
実際のサイト内のコンテンツでは、どんな形の時にどんなふうに使うのが一般的なのかわかりません。

初歩的なことで恐縮ですが、ご助言いただけると嬉しいです。

こんにちは。

MTForとMTLoopですが、実は私もまだよく分かってはいません(^^;。
プログラマではないので、配列と言われても「?」なので、とにかく動かしてみて使いどころを調べている、といったところでしょうか。

MTLoopは任意のキーで並べ替えができますね。MTEntriesのsort_byで出来ない並べ替えをしたい時などに使えると思います。
MTForは何番目から何番目までを表示する、ということが出来るので、lastn="x"やoffset="x"が使えない場合にMTForでその代りをさせてみる、というふうに使えるのではと思います。

例えばこのエントリーの場合だと、やりたいことは「ブログ記事をトラバを受けた日時で並び変えて、最新から5件表示させたい」です。
しかしMTEntriesのsort_byには「トラバを受けた日時でソート」できる機能はない。それでMTLoopを使ってみることにする。だけどMTLoopでソートしただけでは全部の記事が出てきてしまう。欲しいのは最初の5件だけなのにMTLoopにはlastnやoffsetはない。そこでMTForで繰り返し件数を制御できないか。・・・というふうに考えてみたわけです。

私も勉強中です。変数は応用範囲が広くて答えも1つではないので(同一カテゴリ内での前後移動だけでも何通りもの組み合わせが出来てしまう)、分かるところから使っていって少しずつ慣れていけばいいのでは…と思ってます。

プログラマの方ならもっと整然とした答えが出せたんじゃないかと思うのですが、こんなお返事ですみません;;。

お返事ありがとうございました。

プログラミングをされているわけではないのですね。
カスタマイズ絡みのエントリーを拝見していると、とてもそんなふうに思えません。。。

仕事でMTのソースをガリガリ書いていると、これは「開発」じゃないの?と良く思います。
MTの記事を書いている方は比較的SE寄りの方が多く、
世間的にも「開発」として認知される傾向が比較的強いのかなと思っています。

MTForはちょっと前にMTArchiveList内の繰り返し処理の際に使ってみようとトライし経緯があったんですが、挫折しました。
繰り返し処理が絡むときに、すこしでも知識が備わっていれば、いろいろと役立ちそうですね。
強化しつつ片隅にいれておこうと思います。

今後も参考にさせていただきます。

ありがとうございます。
MTに出会う何年か前にCGI掲示板の改造に(仕事ではなく楽しみで)ハマっていたことがあるので、そのおかげで「if」「else」「$変数」みたいな感覚に少しは慣れがあったのかもしれません。
でも自己流で自分に分かる範囲のことしかやってないので、ちゃんと最初から勉強したいとは思っているんですよ。

MTForは「テンプレートタグ虎の巻」にわりと具体的な使い方が載っていたと思います。使いこなせるようになるとかなり複雑な制御も出来るようになるのではと思います。

カスタマイズ記事はだいたい「自分のサイトに必要なこと」「思いつき・閃きのメモ」が中心ですが、MT使われている方のささやかなお役立ちになってくれたら嬉しいです。