Movable Typeの標準機能での動的ページ分割(その1)

Movable Typeでは、メインページ等のブログ記事一覧を一定件数ずつに区切って過去の記事にさかのぼれるようにする場合、PageButeプラグインを使うことが多いです。
Movable Typeを使う案件では、セキュリティ対策のためにMTのサーバーと公開サーバーを分けて、公開サーバーではCGIやPHPを禁止することもよくあります。
このような場合は、PageButeプラグインを使って静的にページ分割するしか手はないでしょう。

しかし、そのような制限がない案件なら、ページ分割を動的に行うことも考えられます。
Movable Type 4.3(英語版)から動的なページ分割の機能が標準装備されていて、Movable Type 5.xでも使うことができます。
1ページ目を静的に出力し、2ページ目以降を動的に出力することができます。
今日は、ブログのメインページの動的ページ分割を行う基本的な方法を紹介します。

2012年12月13日
抜けていた箇所があったので追記しました。

1.Movable Type標準の動的ページ分割の概要

Movable Type標準の動的ページ分割では、検索(mt-search.cgi)を利用して分割を行います。
メインページやアーカイブページの1ページ目は静的に出力し、2ページ目以降は動的に出力します。

2.「ページネーション」テンプレートモジュールの作成

ブログでページ分割を行えるようにするには、まずブログに「ページネーション」のテンプレートモジュールを追加します。
テンプレートモジュールの内容は、以下のようにします。

<mt:SetVarBlock name="pagination_navigation">
  <mt:If name="search_results">
    <mt:IfMoreResults>
      <li><a rel="prev" href="<$mt:NextLink encode_html="1"$>">過去の記事</a></li>
    </mt:IfMoreResults>
    <mt:IfPreviousResults>
      <li><a rel="next" href="<$mt:PreviousLink encode_html="1"$>">新しい記事</a></li>
    </mt:IfPreviousResults>
  <mt:Else>
    <mt:If name="archive_template">
      <$mt:ArchiveCount setvar="total_entries"$>
    <mt:Else>
      <$mt:BlogEntryCount setvar="total_entries"$>
    </mt:If>
    <mt:If name="total_entries" gt="$entries_per_page">
      <li><a rel="prev" href="<$mt:Var name="search_link" encode_html="1" $>2">過去の記事</a></li>
    </mt:If>
  </mt:If>
</mt:SetVarBlock>

<mt:If name="pagination_navigation">
  <ul>
    <$mt:Var name="pagination_navigation"$>
  </ul>
</mt:If>

MTSetVarBlockタグのブロックの前半(3~8行目)は、動的出力(2ページ目以降)での、前後のページへのリンクを生成します。
MTIfPreviousResultsMTIfMoreResultsタグで前後のページがあるかどうかを調べ、あればMTPreviousLinkMTNextLinkタグで前後のページへのリンクを出力します。

MTSetVarBlockタグのブロックの後半(10~17行目)は、静的出力(1ページ目)での、前後のページへのリンクを生成します。
出力する記事数(メインページではブログ全体の記事数、アーカイブページではアーカイブに属する記事数)が、1ページあたりの記事数よりも多い場合は、2ページ目へのリンクを出力します。
テンプレート内にentries_per_pageとsearch_linkの2つの変数がありますが、これらは後でメインページ(およびアーカイブページ)のテンプレートで設定します。

最後のMTIfタグのブロックは、ページ分割のリンクがあるときのみ、そのリンクを出力する処理です。

なお、このテンプレートでは前後のページへのリンクをul/li要素にしていますが、必要に応じて他の要素を使うこともできます。

3.メインページのテンプレートの先頭部分の書き換え

次に、メインページのインデックステンプレートを開き、その先頭に以下の部分を追加します。

<$mt:Var name="entries_per_page" value="10"$>
<mt:SetVarBlock name="search_link">
    <$mt:CGIPath$><$mt:SearchScript$>?IncludeBlogs=<$mt:BlogID$>
    &template_id=<$mt:BuildTemplateID$>
    &limit=<$mt:Var name="entries_per_page"$>
    &archive_type=Index
    &page=
</mt:SetVarBlock>
<$mt:Var name="search_link" strip="" trim="1" encode_html="1" setvar="search_link"$>

1行目のMTVarタグは、分割後の1ページあたりの記事数を設定する処理です。
上の例では「value="10"」にしていますので、1ページあたり10件になります。

2~8行目は、2ページ目へのリンクのアドレスを、変数search_linkに代入する処理です。
また、9行目は変数search_linkの値から余分なスペースを取り除く処理です。

4.MTEntriesタグの書き換え

次に、メインページのテンプレートの中で、MTEntriesタグを検索し、以下のように書き換えます。

<mt:Entries limit="$entries_per_page" search_results="1">

5.ページ移動リンクの出力

次に、メインページのテンプレートの中で、前後のページへのリンクを出力したい位置に、以下のテンプレートタグを追加します。

<$mt:Include module="ページネーション"$>

6.ちなみに

Movable Type 5.2.2で、新しいテーマの「Rainier」が追加されました。
Rainierのテンプレートでは、動的ページ分割の機能が組み込まれた形になっています。