Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む(改)

Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む(改)

Posted at August 24,2009 1:33 AM
Tag:[Customize, MovableType, Paginate]

以前公開した「Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む」で、表示するページ数を常に一定にできるよう、機能を追加しました。

1.比較

以下、offset モディファイアに「2」を設定した場合の、機能追加前と機能追加後の表示です。offset モディファイアとは、現在表示中のページから前後に表示するページ数を指定するためのものでます。「2」を設定すれば、現在のページと前後ページ含め最大5ページ分が表示されますが、機能追加前では、末端のページのオフセットは切り捨てられます。

機能追加前

1ページ目
機能追加前の1ページ目

2ページ目
機能追加前の2ページ目

5ページ目
機能追加前の5ページ目

9ページ目
機能追加前の9ページ目

10ページ目
機能追加前の10ページ目

機能追加後

機能追加後は、切り捨てられた分のオフセットを反対側のオフセットに加えることで、常に同じページ数を表示することができます。

1ページ目
機能追加後の1ページ目

2ページ目
機能追加後の1ページ目

5ページ目
機能追加後の1ページ目

9ページ目
機能追加後の1ページ目

10ページ目
機能追加後の1ページ目

以下、カスタマイズ方法です。機能追加後の表示を行いたい場合は必ず4項の設定を行なってください。

2.MTPaginate プラグインによるページ分割の設定

下記の記事を参考にして、MTPaginate プラグインを Movable Type に設定してください。

注:2項を実施する前に、必ずページ分割が正常に動作することを確認してください。すべてを一気に行うと、正常に動作しなかった場合の切り分けができなくなります。

3.プラグインファイルの修正

MTPaginate/lib/MTPaginate.pm を任意のエディタで開き、赤色部分(v1.28 では 497行~506行辺り)を削除し、青色部分を追加します。

                        $format_title = " . sprintf(' title=\"$format_title\"', \$i)" if $format_title;
                        $res .=<<PHP;
for(\$i = $start; \$i <= $end; \$i++) {
        if(\$i > $start)
                echo '$separator';
        if(\$i == \$paginate_current_page) {
                echo sprintf("$format_current", \$i);
        } else {
                echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
        }
}
PHP
                        if ($format_all && $place_all eq 'after') {

下が置き換えた後のリストです。

                        $format_title = " . sprintf(' title=\"$format_title\"', \$i)" if $format_title;
                        my $offset = $args->{offset} || 2;
                        my $fixed_offset = $args->{fixed_offset} || 0;
                        $res .=<<PHP;
if ($fixed_offset) {
  if (($end - \$paginate_current_page) <= $offset) {
    \$before_offset = $offset + ($offset - ($end - \$paginate_current_page));
    \$after_offset = $offset;
  } else if ((\$paginate_current_page - $start) <= $offset) {
    \$before_offset = $offset;
    \$after_offset = $offset + ($offset - (\$paginate_current_page - $start));
  } else {
    \$before_offset = $offset;
    \$after_offset = $offset;
  }
} else {
  \$before_offset = $offset;
  \$after_offset = $offset;
}
for (\$i = $start; \$i <= $end; \$i++) {
  if (\$paginate_current_page == 'all') {
    if(\$i > $start)
      echo '$separator';
    if(\$i == \$paginate_current_page) {
      echo sprintf("$format_current", \$i);
    } else {
      echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
    }
  } else {
    if (\$i > $start) {
      if (\$i == \$paginate_current_page && \$i != 1) {
        echo '$separator';
      } else if (\$i < \$paginate_current_page) {
        if (\$paginate_current_page - \$i < \$before_offset) {
          echo '$separator';
        }
      } else {
        if (\$i - \$paginate_current_page < (\$after_offset+1)) {
          echo '$separator';
        }
      }
    }
    if (\$i == \$paginate_current_page) {
      echo sprintf("$format_current", \$i);
    } else {
      if(\$i < \$paginate_current_page) {
        if(\$paginate_current_page - \$i < (\$before_offset+1)) {
          echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
        }
      } else {
        if(\$i - \$paginate_current_page < (\$after_offset+1)) {
          echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
        }
      }
    }
  }
}
PHP
                        if ($format_all && $place_all eq 'after') {

4.offset モディファイアの指定

テンプレートに記述している MTPaginateNavigator タグに offset モディファイアを与えれば、前後に表示するページ数を指定できます。
指定しない場合のデフォルト値は2になっているので、前後2ページを表示します。

<MTPaginateNavigator offset="3">

とすれば、表示ページの前後3ページのナビゲーションを表示します。

5.fixed_offset モディファイアの指定

テンプレートに記述している MTPaginateNavigator タグに fixed_offset="1" を与えれば、末端のページでも、offset モディファイアで設定した値になるように表示します。指定しない場合のデフォルト値は 0 です。

<MTPaginateNavigator offset="2" fixed_offset="1">

とすれば、表示中のページにかかわらず、常に5ページのナビゲーションを表示します(ページ分割数が5ページ以下の場合を除く)。

関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

ブログの細かなナビゲーションを改善&アップグレード!【Movable Typeカスタマイズ】 from shoe-g.com 植山周志のぶっ飛びブログ
このブログをちょっと使いやすく、見やすくしようと細かなところをいくつか変更してみ... [続きを読む]

Tracked on March 2, 2010 4:28 PM
コメント

ページ分割の件で質問です。MT4.21を使用しております。
メインページ、アーカイブ(月別)ページ、カテゴリページの分割自体は大分前に導入し、不具合無く動いているのですが、先日googleウェブマスターツールにてtitleタグとDescriptionの重複が出ているのを最近気付き、そちらを修正しようと考えておりました。

具体的には、
<$MTPaginateCurrentPage$>タグを使って、titleタグ内とmetaタグ内Description項目に番号を割り当てようと思っているのですが、どうやっても番号の表示がされません。

<meta name="description" content="hogehoge no.<MTPaginate><$MTPaginateCurrentPage$></MTPaginate>" />
<title>hogehoge <MTPaginate><$MTPaginateCurrentPage$></MTPaginate></title>

こんな感じで指定しているのですが、再構築後アクセスしても数字は表示されず、FTPでソースを確認してみると、タグ挿入していた部分には、
<?php echo $paginate_current_page; ?>
と生成されているので、間違いがあるような感じではないのですが・・・。

ちなみにタグ前後の<MTPaginate>を入れないと再構築エラーになるので入れてますが、他サイトで解説されていたのを見ると、前後にタグを入れず<$MTPaginateCurrentPage$>を入れたらOKという解説もあったりで、いまいちよくわかりません。
参考URL:www.weblaads.info/movablepress/posts/paginate-causes-repetition-of-title-and-description/

もしアドバイスがありましたら何卒宜しくお願いいたします。

[1] Posted by 苦戦中 : August 27, 2009 12:42 PM

>苦戦中さん
こんばんは。
ご質問の件ですが、分かり次第別途エントリー致します。
すいませんが少々お時間ください。
それではよろしくお願い致します。

[2] Posted by yujiro logo : September 1, 2009 1:25 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)