個別エントリー記事からブログを横断して時系列前後のエントリーへのリンク

Movable Typeでサイトつくる時って、だいたいコンテンツごとにブログをたてる。

レアケースだと思うんだけど、
個別エントリー記事からブログをまたいで時系列での前後のエントリーへのリンク欲しいみたいな話があり。
(mt:EntryPrev、mt:EntryNextをmt:MutiBlog環境でやりたい)

ちゃんと動いたけど、たぶんものすごく無理矢理。もっと省略できそうだし。

流れ

  • 複数ブログの全エントリーIDを配列に格納
    • mt:SetVar value=""でvalue内にカンマ区切りで値いれてもダメみたい。なので、mt:SetVarBlockで。
    • 複数のブログを横断しても同一MT内であればmt:EntryIDの重複はないよう。
  • 現ページのエントリーIDと1.の配列を比較して、配列上の前後のエントリーのIDを抽出。
  • mt:Entries id="" blog_ids=""でそのIDに該当するエントリーのタイトルとパーマリンクをとってくる。
<mt:SetVarBlock name="blog_ids">*カンマ区切りでまたぎたいブログIDを指定</mt:SetVarBlock>

<mt:Ignore>1. 複数ブログ記事のmt:EntryIDを配列EntryIDsに格納、$blog_idにはカンマ区切りでマージしたいブログIDを指定</mt:Ignore>
<mt:SetVar name="id" value="0">
<mt:Entries lastn="0" blog_ids="$blog_ids">
<mt:SetVarBlock name="EntryIDs" index="$id"><$mt:EntryID$></mt:SetVarBlock>
<mt:SetVarBlock name="id"><$mt:GetVar name="id" value="$id" op="++"$></mt:SetVarBlock>
</mt:Entries>

<mt:Ignore>2. この個別ページのmt:EntryID、1. のEntryIDsから要素数、最新のエントリーのmt:EntryID、最古のエントリーのmt:EntryID(コレ使わないけど)を取得</mt:Ignore>
<mt:SetVarBlock name="thisID"><$mt:EntryID$></mt:SetVarBlock>
<mt:SetVarBlock name="latestID"><$mt:GetVar name="EntryIDs[0]"$></mt:SetVarBlock>
<mt:SetVarBlock name="EntryID_number"><$mt:GetVar name="count(EntryIDs)" op="-" value="1"$></mt:SetVarBlock>
<mt:SetVarBlock name="oldestID"><$mt:GetVar name="entryID[$entryID_number]"$></mt:SetVarBlock>

<mt:Ignore>3. for文をつかって、$thisIDと配列内の要素を比較。一致したら$thisCountにそのインデックス値を代入</mt:Ignore>
<mt:for var="x" from="0" to="$EntryID_number">
<mt:SetVarBlock name="id"><$mt:GetVar name="EntryIDs[$x]"$></mt:SetVarBlock>
<mt:If name="thisID" eq="$id">
<mt:SetVarBlock name="thisCount"><$mt:GetVar name="x"$></mt:SetVarBlock>
</mt:If>
<mt:Ignore>//確認用:<$mt:GetVar name="x"$>:<$mt:GetVar name="EntryIDs[$x]"$>,</mt:Ignore>
</mt:for>

<mt:Ignore>4. 3.の$thisCount基準に、前後のインデックス値を取得(前:$prevCount、後:nextCount)</mt:Ignore>
<mt:SetVarBlock name="prevCount"><$mt:GetVar name="thisCount" value="1" op="+"$></mt:SetVarBlock>
<mt:SetVarBlock name="nextCount"><$mt:GetVar name="thisCount" value="1" op="-"$></mt:SetVarBlock>

<mt:Ignore>5. 前後のインデックス値の要素を取得(前:$prevID、後:$nextID)</mt:Ignore>
<mt:SetVarBlock name="prevID"><$mt:GetVar name="EntryIDs[$prevCount]"$></mt:SetVarBlock>
<mt:SetVarBlock name="nextID"><$mt:GetVar name="EntryIDs[$nextCount]"$></mt:SetVarBlock>

<mt:Ignore>6. $prevID、$nextIDでもって$prevLinkと$nextLinkに前後のタイトルとリンクを代入</mt:Ignore>
<mt:Ignore>//最古のページなら$prevLinkは定義しない</mt:Ignore>
<mt:If name="thisCount" ne="$EntryID_number">
<mt:SetVarBlock name="prevLink">
<mt:Entries id="$prevID" blog_ids="$blog_ids"><a href="<$mt:EntryPermalink$>">[前]← <$mt:EntryTitle$></a></mt:Entries>
</mt:SetVarBlock>
</mt:If>
<mt:Ignore>//最新のページなら$nextLinkは定義しない</mt:Ignore>
<mt:If name="thisCount" ne="0">
<mt:SetVarBlock name="nextLink">
<mt:Entries id="$nextID" blog_ids="$blog_ids"><a href="<$mt:EntryPermalink$>">[次]→ <$mt:EntryTitle$></a></mt:Entries>
</mt:SetVarBlock>
</mt:If>

あとは、好きな位置で

<$mt:GetVar name="prevLink"$>
<$mt:GetVar name="nextLink"$>

で前後のリンクを出力させる。