カテゴリをまたいで前後のブログ記事にリンクする

MTQに、「カテゴリをまたいで前後のブログ記事にリンクしたい」といった内容の質問がありました。
この質問に答えてみます。

1.質問の概要

まず、質問の概要です。
以下のような構造でカテゴリとブログ記事があるものとします。

  • カテゴリA
       
    • 記事ア
    •  
    • 記事イ
    •  
    • 記事ウ
    •  
    • 記事エ
  • カテゴリB
       
    • 記事カ
    •  
    • 記事キ
  • カテゴリC
       
    • 記事サ
    •  
    • 記事シ
    •  
    • 記事ス

各記事で、同一カテゴリ内での前後の記事にリンクするようにします。
例えば、記事イの前後の記事は、記事ア/記事ウになります。

また、各カテゴリの最後の記事では、次の記事として、次のカテゴリの最初の記事にリンクします。
例えば、カテゴリAの最後の記事である記事エは、カテゴリBの最初の記事の記事である記事カにリンクします。
同様に、各カテゴリの最初の記事では、前の記事として、前のカテゴリの最後の記事にリンクします。

なお、質問された方の希望では、最後のカテゴリの最後の記事では、次の記事として、最初のカテゴリの最初の記事にリンクするようにしたいとのことでした。
上の構造でいえば、カテゴリCの記事スでは、次の記事としてカテゴリAの記事アにリンクします。
同様に、最初のカテゴリの最初の記事では、前の記事として、最後のカテゴリの最後の記事にリンクしたいとのことです。
ただ、この希望をテンプレートタグだけで処理すると、負荷が高い処理になります。
そこで、「最後のカテゴリの最後の記事の次」と「最初のカテゴリの最初の記事の前」の処理は割愛します。

また、上に挙げた例では、カテゴリは1階層です。
しかし、カテゴリが2階層以上ある場合も考えられます。
ただ、2階層以上ある場合、テンプレートタグだけで処理すると、負荷が高い処理になります。
そこで、2階層以上ある場合も割愛して、1階層だけだと仮定します。

1.同一カテゴリ内で前後のブログ記事にリンク

まず、同一カテゴリ内で、前後のブログ記事にリンクすることが必要です。
Movable Typeのタグリファレンスには記載がありませんが、MTEntryPreviousタグ/MTEntryNextタグに「by_category="1"」のモディファイアを付加すると、同一カテゴリ内での前後の記事を得ることができます。

<mt:EntryPrevious by_category="1">
  同一カテゴリ内での前の記事へのリンクを出力する部分
</mt:EntryPrevious>
<mt:EntryNext by_category="1">
  同一カテゴリ内での次の記事へのリンクを出力する部分
</mt:EntryNext>

2.前後の記事がないときの処理を入れる

MTEntryPrevious/MTEntryNextタグでは、前後の記事がないときには何も出力しません。
また、MTElseタグを入れても処理されません。
しかし、今回の話では、同一カテゴリ内で前後の記事がなければ、前後のカテゴリの記事にリンクする必要があります。

そこで、MTEntryPrevious/MTEntryNextタグのブロックの中で、同一カテゴリ内の前後の記事を出力した場合には、フラグ用の変数に値を代入します。
そして、ブロックの後で、変数に値が代入されているかどうかを判断します。
同一カテゴリ内の前後の記事を出力していなければ、変数に値がセットされていないので、その場合は前後のカテゴリの記事にリンクするようにします。
フラグの変数名をis_prev/is_nextにするとすれば、以下のようにテンプレートを組みます。

<mt:EntryPrevious by_category="1">
  <$mt:SetVar name="is_prev" value="1"$>
  同一カテゴリ内での前の記事へのリンクを出力する部分
</mt:EntryPrevious>
<mt:Unless name="is_prev">
  前のカテゴリの最後の記事へのリンクを出力する部分
</mt:Unless>
<mt:EntryNext by_category="1">
  <$mt:SetVar name="is_next" value="1"$>
  同一カテゴリ内での次の記事へのリンクを出力する部分
</mt:EntryNext>
<mt:Unless name="is_next">
  次のカテゴリの最初の記事へのリンクを出力する部分
</mt:Unless>

3.次のカテゴリの最初の記事/前のカテゴリの最後の記事にリンク

前後のカテゴリを表すテンプレートタグとして、MTCategoryPrevious/MTCategoryNextタグがあります。
ブログ記事のコンテキストの中で、MTCategoryPrevious/MTCategoryNextタグを使うと、そのブログ記事が属する主カテゴリについての、前後のカテゴリを得ることができます。

MTCategoryPrevious/MTCategoryNextタグのブロックの中で、MTEntriesタグを使えば、前後のカテゴリのブログ記事を出力できるはずです。
ただ、ブログ記事テンプレートの中でそのようにすると、思ったような記事を得ることができませんでした。
前後のカテゴリの名前を変数に代入して、MTEntriesタグのcategoryモディファイアにその変数を指定すると、希望通りの動作になりました。

最終的に、前後の記事へのリンクを出力する部分は、以下のような形になります。

<mt:EntryPrevious by_category="1">
  <$mt:SetVar name="is_prev" value="1"$>
  同一カテゴリ内での前の記事へのリンクを出力する部分
</mt:EntryPrevious>
<mt:Unless name="is_prev">
  <mt:CategoryPrevious>
    <$mt:CategoryLabel setvar="cat_label"$>
    <mt:Entries sort_order="ascend" lastn="1" category="$cat_label">
      前のカテゴリの最後の記事へのリンクを出力する部分
    </mt:Entries>
  </mt:CategoryPrevious>
</mt:Unless>
<mt:EntryNext by_category="1">
  <$mt:SetVar name="is_next" value="1"$>
  同一カテゴリ内での次の記事へのリンクを出力する部分
</mt:EntryNext>
<mt:Unless name="is_next">
  <mt:CategoryNext>
    <$mt:CategoryLabel setvar="cat_label"$>
    <mt:Entries sort_order="descend" lastn="1" category="$cat_label">
      次のカテゴリの最初の記事へのリンクを出力する部分
    </mt:Entries>
  </mt:CategoryNext>
</mt:Unless>