top

同一カテゴリー内での前後エントリーへのリンク(4) offset版

何回、同じようなエントリを書いてるんだと言われそうですが…(^^;。投稿日時で比較するのではなく、別の方法でも実装できることに気が付いたので、それも覚え書き。前後リンク部分の見通しがよくなったので、使いやすそうかなと。

■ 基本編 4.2~(ダイナミック時)
__counter__変数を使っているので4.2以上向けです。
(*静的生成なら4.1から使えます。)

<MTSetVarBlock name="thisid"><$MTEntryID$></MTSetVarBlock>
<MTSetVarBlock name="ecat"><$MTEntryCategory$></MTSetVarBlock>

<MTEntries category="$ecat">
<MTSetVarBlock name="eid"><$MTEntryID$></MTSetVarBlock>
<MTIf name="eid" eq="$thisid">
<MTSetVarBlock name="prev"><$MTVar name="__counter__"$></MTSetVarBlock>
<MTSetVarBlock name="next"><$MTVar name="__counter__" value="2" op="-"$></MTSetVarBlock>
</MTIf>
</MTEntries>


<MTEntries category="$ecat" lastn="1" offset="$prev">
<a href="<$MTEntryPermalink$>">&laquo; <$MTEntryTitle$></a>
</MTEntries>
|
<MTIf name="next" ge="0">
<MTEntries category="$ecat" lastn="1" offset="$next">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$> &raquo;</a>
</MTEntries>
</MTIf>

単純に<MTEntries lastn="1" offset="5">などで実装できないの?と考えまして…。
まず該当記事が同じカテゴリ内で何番目に位置しているかを求めます。「前のリンク」ならその数字がそのままoffsetで除外する数字になります。「次のリンク」なら2を引けばそれがoffsetで除外する数字になります。
これならループも記事番号を求めるときに1回まわるだけで済むので動きもシンプルだし、考え方としても分かりやすいのではと。

■ 応用編 4.1~
青字の部分を以下に差し替えれば4.1のダイナミックでもoffsetで前後リンクを出すことが出来ます。

<MTSetvar name="pncount" value="0">
<MTEntries category="$ecat">
<MTSetVarBlock name="eid"><$MTEntryID$></MTSetVarBlock>
<MTSetVar name="pncount" op="++">
<MTIf name="eid" eq="$thisid">
<MTSetVarBlock name="prev"><$MTGetVar name="pncount"$></MTSetVarBlock>
<MTSetVarBlock name="next"><$MTGetVar name="pncount" value="2" op="-"$></MTSetVarBlock>
</MTIf>
</MTEntries>

バリエーション:他にこんな方法もあります。
同一カテゴリー内での前後エントリーへのリンク(3)改 MT4.0~
同一カテゴリー内での前後エントリーへのリンク(2) MT4.1~

 

コメント

いつも参考にさせていただいています。
こちらのエントリーの
>該当記事が同じカテゴリ内で何番目に位置しているか
についてはどこで求めて(判定?)しているのでしょうか。

お手間かと思いますが、アドバイスいただけるとうれしいです。
まずは青テキストの部分を理解したく。

こんにちは。
>該当記事が同じカテゴリ内で何番目に位置しているか
説明の通り、__counter__変数を使って判定してます。まず冒頭の黒字の部分で該当記事のIDと所属カテゴリを求め、青字の部分で「IDが一致する記事は所属カテゴリの中で何番目の記事か」を出しています。

基本的にはMTSetVarBlockとMTIfの簡単な組み合わせですから、この2つのMTタグの使い方が分かれば内容は理解できると思います。
http://www.movabletype.jp/documentation/appendices/tags/setvarblock.html
http://www.movabletype.jp/documentation/appendices/tags/if.html
よろしくです。

お返事遅れました。
ご助言ありがとうございます。

エントリーの数分回して、該当エントリーのエントリーIDの前後のエントリーIDをもとに、タイトルやリンク先を抽出する感じかなと思いますが、
__counter__変数を使った仕組みをうまいこと使いこなせていないのが、イマイチ掴めない原因になっているので、こちらを参考に精査させてもらいます。

>該当エントリーのエントリーIDの前後のエントリーIDをもとに
あ、そうではなくて、求めているのは該当記事のIDだけで、前後の記事のIDは求めてないです。該当記事のIDさえ分かれば用は足りるので。

まず前提として。
前後記事を求めるにはいろいろな考え方があります。考え方によって求める方法も違ってきます。例えば投稿日付で判定する場合は該当記事より前に投稿された記事で一番新しいものが「1つ前の記事」、後で投稿されたもので一番古いのが「1つ先の記事」になりますよね。ならば「記事より前に投稿された記事で一番新しい記事」を求めるにはどういう方法があるだろう?ということになります。

この記事ではMTEntriesのもっとも基本的なモディファイア、lastnとoffsetを利用できないだろうかという発想から来ています。
<MTEntries lastn="1" offset="5">
としたら、最新5件の記事より後の1件を表示しますよね。つまり「6番目」の記事を表示することになりますよね。ということは、該当記事のナンバーをoffsetに入れればそのまま「該当記事の1つ前に投稿された記事」を表示できることになりますよね。
じゃあ1つ後の記事を表示するには? 記事ナンバーが5だった場合、2引いて<MTEntries lastn="1" offset="3">とすれば4番目の記事(=1つ後の記事)を表示出来ますよね。

ということは。
該当記事のナンバーとそれから2引いた数が分かれば前後記事を表示できることになります。__counter__変数はそのものずばり記事のナンバーを表示するタグです。
<MTEntries>
<$MTVar name="__counter__"$> <$MTEntryTitle$>
</MTEntries>
とすれば記事の前にナンバー打って表示してくれます。
ですから<MTIf name="記事ID" eq="該当記事ID">として、あらかじめ求めておいた記事IDと一致する記事のナンバーを出しているわけです。それをそのままoffsetに入れれば「前の記事」、opモディファイアで2引いた数をoffsetに入れれば「後の記事」になるわけです。

そんなに難しく考えないで下さいね、基本はすごく単純な発想でやってますので(^^;。