Paged Archivesプラグインによる静的ページネーションの改良

はじめに

今回はMTでプラグインを使って静的ページネーションをを行う事についての話題です。

MTで静的ページネーションといえば、私の知りうる限りでは、株式会社スカイアークが提供しているPageButeプラグインの名前をよく目にします。

静的ページ用ページ分割プラグイン:PageBute - Movable Type技術ブログ
http://www.mtcms.jp/movabletype-blog/plugins/pagebute/200702011953.html

しかし、PageButeプラグインにはページネーションによるページ数が変化した場合、ゴミページが残ってしまう、という弱点があります(例えば3ページ→2ページにページ数が減った場合に、3ページがゴミとして残る)。

この為、筆者が静的ページネーションを行う場合は、Paged Archives というプラグインを利用しています。

Alden Bates' Weblog: Paged Archives Plugin
(Pafged Archives プラグインの提供元ページ)
http://www.aldenbates.com/plugins/pagedarchives.html

このプラグインは、前述のページネーションによるゴミページを削除してくれるという、非常にありがたい機能があります。

Paged Archives プラグインの弱点の解消

ただし、Paged Archives プラグインには、ページネーションのリンクリスト(例えばページネーションしているページの下端にある「1,2,3...」と番号が並んでるページ)のhtmlソースの内容が固定でありカスタマイズできない、という弱点がありあます(この辺りはPageButeは対応してるので、世の中そうそう都合のいい事はない、という感じ(′ー`))。

ここからが本題。

今回は、この弱点を解消する為、プラグインのPerlコードをカスタマイズします。

プラグインのPerlコードのカスタマイズ

pagedarchives.pl の29行目を、次のように変更。
処理内容としては、プラグインデータの定義に、項目を追加しています。

(変更前)

        settings => new MT::PluginSettings([
            ['pa_perpage', { Default => 0 }],
            ['pa_useindex', { Default => 0 }],
            ['pa_listbycount', { Default => 0 }]
        ]),

(変更後)

        settings => new MT::PluginSettings([
            ['pa_perpage', { Default => 0 }],
            ['pa_useindex', { Default => 0 }],
            ['pa_listbycount', { Default => 0 }],
            ['pa_source_li_filename_identifier', { Default => '[filename]' }],
            ['pa_source_li_pagetext_identifier', { Default => '[pagetext]' }],
            ['pa_source_list_spacer', { Default => ' ' }],
            ['pa_source_li', { Default => '<li><a href="[filename]">[pagetext]</a></li>' }]
        ]),

pagedarchives.pl プラグインの152行目の下に、次のコードを追加。
具体的には、上述のプラグインデータの定義に追加した項目について、プラグイン設定から変更を行う為のコントロールの定義を追加しています。

<mtapp:setting
  id="pa_source_li_filename_identifier"
  label="<MT_TRANS phrase="Filename-identifier">"
  hint="<MT_TRANS phrase="Name of Filename-identifier.">"
  show_hint=1>
<input type="text" name="pa_source_li_filename_identifier" id="pa_source_li_filename_identifier" value="<mt:var name="pa_source_li_filename_identifier" />" />
</mtapp:setting>


<mtapp:setting
  id="pa_source_li_pagetext_identifier"
  label="<MT_TRANS phrase="Pagetext-identifier">"
  hint="<MT_TRANS phrase="Name of Pagetext-identifier.">"
  show_hint=1>
<input type="text" name="pa_source_li_pagetext_identifier" id="pa_source_li_pagetext_identifier" value="<mt:var name="pa_source_li_pagetext_identifier" />" />
</mtapp:setting>


<mtapp:setting
  id="pa_source_li"
  label="<MT_TRANS phrase="Spacer-code">"
  hint="<MT_TRANS phrase="Template of paginatin-list-item's spacer-code.">"
  show_hint=1>
<input type="text" name="pa_source_list_spacer" id="pa_source_list_spacer" value="<mt:var name="pa_source_list_spacer" />" />
</mtapp:setting>


<mtapp:setting
  id="pa_source_li"
  label="<MT_TRANS phrase="Paginatin-list-item code">"
  hint="<MT_TRANS phrase="Template of paginatin-list-item code.">"
  show_hint=1>
<textarea name="pa_source_li" id="pa_source_li"  class="text high" ><mt:var name="pa_source_li" /></textarea>
</mtapp:setting>

pagedarchives.pl の217行目下に、次のコードを追加。
プラグインデータの値をPerlの変数に代入しています。
quotemetaは、後の文字列置き換え処理において、正規表現に使うメタ文字列を通常の文字列として認識させる為の、エスケープ処理です。

  my $pa_source_li_filename_identifier = quotemeta( $plugin->get_config_value('pa_source_li_filename_identifier','blog:'.$blog->id) );
  my $pa_source_li_pagetext_identifier = quotemeta( $plugin->get_config_value('pa_source_li_pagetext_identifier','blog:'.$blog->id) );
  my $pa_source_list_spacer = $plugin->get_config_value('pa_source_list_spacer','blog:'.$blog->id);
  my $pa_source_li = $plugin->get_config_value('pa_source_li','blog:'.$blog->id);

pagedarchives.pl の230行目あたりを、次のように変更。
ハードコーディングだったページネーション部分のhtmlコードを、プラグインデータに設定した値で文字列置き換えを行う事で、任意のソースに指定できるようにしています。

(変更前)

    $pagelist.=$spacer.'<a href="'.$filename.'">'.$pagetext.'</a>' if($ii != $pagenum);
    $pagelist.=$spacer.'<span class="pacurrent" style="font-weight:bold">'.$pagetext.'</span>' if($ii == $pagenum);
    $spacer=' ';

(変更後)

    my $pageli = $pa_source_li;

    if($ii != $pagenum){
      $pageli =~ s!$pa_source_li_filename_identifier!$filename!g; 
    }
    elsif ( $ii == $pagenum ){
      $pageli =~ s!<a href=".+?">|<\/a>!!g; 
    }
    $pageli =~ s!$pa_source_li_pagetext_identifier!$pagetext!g;

    $pagelist.= $spacer.$pageli;

    $spacer=$pa_source_list_spacer;

追加した機能の概要

今回の変更では、プラグイン設定の項目に、ページネーションのリンクリストのhtmlテンプレートを記載する事で、出力するhtmlの内容をカスタマイズできるようにしました。

変更後のプラグイン設定の内容は、次のようになります。

スクリーンショット 2014-12-06 22.35.29.png

Filename-identifier:
後述の項目「Paginatin-list-item code」に記載するhtmlテンプレートにおける、リンクリストのページ番号に付くリンクのaタグのhref属性の値です。

Pagetext-identifier:
後述の項目「Paginatin-list-item code」に記載するhtmlテンプレートにおける、リンクリストのページ番号です。

ページネーションのリンクリストにおける、個々のページ番号の間に入るhtmlコードをここに記載します。
例えば、「|」を指定すると、実際のリンクリストの見た目が「1|2|3|...」という形になるイメージです。
 

Paginatin-list-item code:
ページネーションのリンクリストにおける、リストアイテム(個々の番号の部分)のhtmlコードの内容をここで定義します。
ページ番号に付くリンクのaタグの値はFilename-identifierに指定した文字列を、ページ番号はPagetext-identifierに指定した文字列を、それぞれ記載します。

例えば、プラグイン設定はデフォルトのままにページネーションのリンクリストを再構築で出力した場合、Paginatin-list-item codeの値から次の様な形で、リンクリストのリストアイテムのhtmlソースが生成されます(2ページ目へのリンクのリストアイテムの場合)。

(「Paginatin-list-item code」の内容)
<li><a href="[filename]">[pagetext]</a></li>

↓↓↓

(出力結果)
<li><a href="2.html">2</a></li>

なお、設定項目Filename-identifier, Pagetext-identifier については、項目 Paginatin-list-item code のhtmlソースの中に、[fiiename], [pagetext] の文字列があると都合が悪い場合に、変更できるようにする為設けたものです。
(結局不要かもしれませんが、、、)

あとがき

今回はカスタマイズしたプラグインはGitHubに登録せず、本記事に変更内容を追記する形にしています。

なんでこんな回りくどい事をしてるか、というと、皆さんに実際に組み込んでもらって理解しほしいから、というのは建前で、Pased Archivesプラグインのライセンスを明記してるソースが見当たらないからです。私が困るのでプラグインを利用される方が困るので、皆さんもプラグインを作成する場合はライセンスを明記しましょう(なお、GitHubに登録する場合は別。なぜかはググってください(′ー`))。

あと、一つ大事な事を忘れていましたが、ページネーションの「前へ」「次へ」のリンクのhtmlコードをカスタマイズする機能を付け忘れてました。

今回提示したサンプルコードを参考にすれば機能追加できると思いますので、これを機会に、プラグインのカスタマイズをやった事がない、という方は挑戦してみてはいかがでしょうか(′ー`)

追記(12/9)

pagedarchives.pl プラグインの152行目の下追加するCMSテンプレートのコードについて、訂正がありました。

mt:var で保存されているプラグインデータを呼び出す箇所について、プラグインデータに保存されているhtmlソースが管理画面のhtmlソースの文法を壊す可能性があり、これを防ぐ為、encode_html="1" とモディファイアを指定する必要があります。

<input type="text" name="pa_source_li_filename_identifier" id="pa_source_li_filename_identifier" value="<mt:var name="pa_source_li_filename_identifier" encode_html="1" />" />

関連するタグ

MT6, MTプラグイン, Perl