PageButeプラグインで静的ページ分割

明けましておめでとうございます。
本年もこのサイトをどうぞよろしくお願いいたします。
遅ればせながら新年のご挨拶。2009年の初エントリーです。

昨年は転職という大きな転機を迎えましたが無事乗り越え、今に至っております。一昨年に引き続きスクールで講師を務めたり、雑誌に寄稿させてもらうという経験もでき、充実した一年となりました。

さて、年始の挨拶はここまでで・・・ここから本題です。
昨日MTの案件をやっていたのですが、アーカイブページ分割の作業をすることとなり、いろいろと調べていました。

MTが<MTEntries>で書き出すアーカイブ一覧は、lastnモディファイアなどで設定された値を上限に記事を順番に出力します。ただし、上限値を超える数の記事が登録されていた場合、超えた分の記事は表示されないという不親切な仕様となっています。
この上限値を超えた分を「次のページへ」などとして参照できるようにするのがページ分割です。ページ分割を実現するには、専用のプラグインを導入するのが一般的になっています。

MTPaginateプラグインが使えればこのサイトと同じやり方でできるのですが、PHP化はされていないし、商用利用は有料ということでボツに。そこで、PageButeプラグイン(現バージョン:3.2.2)を使うことにしました。

このPageButeプラグイン、PHP化していなくても使えるとあって、静的HTMLとしてページを書き出してくれます。例えば「index.html」を分割設定すると、「index_2.html」、「index_3.html」…というようにページを自動的に増やしてくれるという、素晴らしいプラグインです。

公式ページを見て導入はあっさりできたのですが、シンプルであるが故に任意に設定できる項目が少ない印象を受けました。

このプラグインで書き出す<$MTPageLists$>は、分割後の各ページへのリンク一覧を書き出すMTタグですが、リンクテキストとなるページ番号は必ず昇順(1、2、3…というように1から始まる)になります。今回の案件ではこの番号を降順(10、9、8…というように最後の番号から始まる)としなければならなかったので、プラグインを改変して解決しました。

この改変をすると、リンク一覧に並ぶリンクテキスト(ページ番号)が降順になります。順番が入れ替わるのはリンクテキストのみで、記事の並び順自体は変更されません。動作確認をしたのはMovableType 4.23に、改変したPageBute 3.2.2をインストールした環境です。

改変した点は以下の通りです。

  1. PageBute.pl の182行目?189行目のforループの部分を以下のように変更

    my $temp_page_count = $lists->{max_page};
    for (my $i = $lists->{min_page}; $i <= $lists->{max_page}; $i++) {
    $page_lists .= $i == $lists->{min_page} ? '' : $delim;
    $page_lists .= $pb->{link_start};
    $page_lists .= $i == $page_count
    ? "<span class=\"current_page\">$temp_page_count</span>"
    : &_create_link($i, $site_url . $filename, $file_ext, $temp_page_count, 'link_page');
    $page_lists .= $pb->{link_close};
    $temp_page_count--;
    }

    最大ページ数を格納する変数をもう1個作って、ループの度にデクリメントして、リンクの名前として代入してあげます。

  2. MTテンプレートの<MTPageContents>タグを以下のように変更。

    <MTPageContents count="10" navi_count="999">

    countモディファイアには1ページに表示したい数を書きます。navi_countモディファイアはリンク数の上限を表す値です。公式ページには掲載されていないモディファイアですが、改変後はこの値を与えてあげないと特定の条件でうまくいきません。

あとは改変後のプラグインをインストールしなおして、該当のアーカイブを再構築すれば完了。

仕事初めの日からperlを触ったので、これも何かの縁かと考えて今年はperlを学ぼうかと思います。