一定件数以上のリストに「続きを表示」のリンクを付ける

先日、mixiのMovable Typeのコミュニティで、以下のような質問を見かけました。

  • サイドバーに、最新のブログ記事を最大15件表示したい
  • ブログ記事が15件を超えている場合は、「他を見る」のリンクを表示したい

Movable Typeには、ブログ記事等のリストを表示するタグがいくつかあります。
それらのタグの多くには、最近のn件まで表示するためのlastnモディファイアがあります。

ただ、上のご質問のように、lastnで指定した件数よりも、実際にあるブログ記事等の件数が多い場合に、続きがあることを表示する機能はありません。
このような表示を行いたい場合の方法を紹介します。

1.全件数を求めるタグがある場合

ご質問の例のように出力するには、「ブログ記事が全部で15件を超えているときだけ、最新15件の記事の一覧の後に、『他を見る』のリンクを出力する」という処理をすれば良いです。
そのためには、ブログ記事の全件数を知ることが必要です。

ブログ内のブログ記事の全件数は、MTBlogEntryCountタグで得ることができます。
このタグの値を変数に代入して、変数の値が15を超えていれば、「他を見る」のリンクを出力するように処理を行います。

具体的には、以下のようにタグを組みます。
なお、8行目の「リンク先」の箇所は、実際のリンク先のアドレスに置き換えます。

<ul>
<mt:Entries lastn="15">
  <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li>
</mt:Entries>
</ul>
<$mt:BlogEntryCount setvar="entry_count"$>
<mt:If name="entry_count" gt="15">
  <p><a href="リンク先">他をみる</a></p>
</mt:If>

まず、1~5行目で、最近の15件のブログ記事のタイトルを出力します。
6行目で、ブログ全体の記事の数を、変数entry_countに代入します。
そして、7行目のMTIfタグで、変数entry_countの値が15を超えているかどうかを判断し、その時だけ8行目を出力します。

2.全件数を求めるタグがない場合

リストによっては、リストの全件数を求めるタグがない場合もあります。
例えば、MTArchiveListタグを使って、月別アーカイブのリストを出力する場合、月別アーカイブの全件数を求めるようなタグはありません。
このような時の方法を考えます。

2-1.考え方

この場合は、リスト系のタグのlastnモディファイアに「出力したい件数+1」を指定して、最大で「出力したい件数+1」回繰り返しを行うようにします。
例えば、最近3か月の月別アーカイブのリストを出力するなら、「lastn="4"」とします。

もし、リストの全件数が、出力したい件数より多ければ、このリストは「出力したい件数+1」回繰り返されます。
上の例だと、4か月分以上の月別アーカイブがあれば、MTArchiveListタグ内のブロックは4回繰り返されます。

一方、リストの全件数が、出力したい件数以下なら、このリストは「出力したい件数」回以下しか繰り返されません。
上の例だと、月別アーカイブが3か月分以下なら、MTArchiveListタグ内のブロックは3回以下だけ繰り返されます。

これらのことから、繰り返しが4回行われた時は、4か月分以上の月別アーカイブがあることになります。
この性質を利用します。

まず、リスト系のタグを使う前に、「is_over」という名前の変数に「0」を代入しておきます。
後で、この変数を使って、「出力したい件数+1」回の繰り返しが行われたかどうかを判断するようにします。

次に、繰り返しの中で変数「__counter__」の値を調べます。
この変数は、繰り返しの何回目かを表す変数です。

__counter__の値が「出力したい件数」以下であれば、通常どおりにリストを出力します。
一方、__counter__の値が「出力したい件数+1」になった時には、リストは出力せずに、変数is_overに「1」を代入します。

このようにすると、リスト全体の件数が、「出力したい件数」以下で収まっていれば、変数is_overの値は、リストに入る前にセットした0のままになります。
一方、リスト全体の件数が、「出力したい件数」より大きい場合、繰り返しの最後の処理で、変数is_overに値1がセットされることになります。
後は、リスト出力の繰り返しが終わった後で、変数is_overに値1がセットされているかどうかで、「他を見る」のリンクを出力するかどうかを変えるようにします。

2-2.タグの組み方

ここまでの話に基づいて、実際にタグを組んでみましょう。

例えば、月別アーカイブページのリストを最近3か月分だけ出力し、それより過去の月別アーカイブページがあるときは、「他を見る」のリンクを出力するとします。
それには、以下のようにタグを組みます。

<mt:SetVar name="is_over" value="0">
<ul>
<mt:ArchiveList archive_type="Monthly" lastn="4">
  <mt:If name="__counter__" le="3">
    <li><a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a></li>
  <mt:Else>
    <mt:SetVar name="is_over" value="1">
  </mt:If>
</mt:ArchiveList>
</ul>
<mt:If name="is_over">
  <p><a href="リンク先">他を見る</a></p>
</mt:If>

1行目で、変数is_overに0を代入します。
3行目で、月別アーカイブを出力する処理を、を4回繰り返します。

4行目のMTIfタグで、変数__counter__の値が3以下かどうかを調べます。そして、3以下であれば、5行目が処理されて、各月別アーカイブのリンクが出力されます。
一方、変数__counter__の値が4の時は、4行目の条件が成立しません。
この場合は8行目の処理に進み、変数is_overの値が1になります。

そして、11行目以降で、変数is_overの値が1の時(月別アーカイブページが4件以上あるとき)だけ、「他を見る」のリンクが出力されます。