Movable Typeにおいて、例えばブログのメインインデックスを1ページ目はHTMLファイルを出力し、2ページ目以降はリクエストの都度動的生成する仕組みの話です。5年半前にスタティックパブリッシングのページ分割機能を試すという記事で同じ内容を書いたものの使うことはなかったのですが、ちょっと使ってみようかと考え試してみました。(あと自分で記事を読み直してもよく分からなかったもので...。)
改めて試すにあたり参考になったのが、MovableType.org – MT5 Documentation: Paginating the Main Index Templateです。「前へ」「次へ」やXページ目へ移動するリンクを出力するロジックが図解されていて分かりやすかったです。
リライトしたコード
僕がコードストックとして利用しているサイトに、静的出力と動的出力併用時のページネーション | Movable Type | Hideki's Code Stockをアップしました。コードのコメントを日本語で記述しました。
工夫した点
- 1ページに表示する記事数は、GetEntriesOnIndexプラグインを使用して管理画面の「表示される記事数」の設定値を取得するようにしました。(
<$mt:SetVar name="entries_per_page" value="x"$>
で上書き可。) - メインインデックスだけでなく、アーカイブテンプレートでも同じテンプレートが利用できるように、変数search_linkの生成コードを工夫しました。(10行目〜24行目参照。)
このコードを理解するためのポイント
- mt-search.cgiの引数にtemplate_idやarchive_typeを渡すと、検索結果テンプレートではなくインデックステンプレートやアーカイブテンプレートをよしなに解釈してくれる模様。
- mt-search.cgiで処理しているのか、静的なHTMLファイルなのかは、予約変数search_resultsで判別できる。(Movable Type 6 本格活用ガイドブック (Web Designing BOOKS)のP103〜105を参照。)類似の変数として、main_index・archive_template・category_archiveを利用している。
- 記事情報を出力する
<mt:Entries>
にsearch_results="1"
を指定すると、mt-search.cgiで処理される。
ハマったポイント
アーカイブテンプレートをページングした際に、なぜか「テンプレートはインデックスではないアーカイブタイプのブログ記事リストでなければなりません」とエラーが出ました。設定に問題が無いので検索してみたところ、「「カテゴリ別記事リスト」テンプレートのページ送りエラーの対処法 - eigerで作るMovableType」に解決策がありました。mt_templateテーブルのデータを編集したところ解決しました。
気になるところ
インデックステンプレート・アーカイブテンプレートをこのコードでページネーションすると、URLがすべて/path/to/mt/mt-search.cgi
になってしまう点です。場合によってはURLのリライトも考えた方が良いかなと感じました。