アーカイブページのページ分割 for Movable Type 4.1

アーカイブページのページ分割 for Movable Type 4.1

Posted at April 10,2008 12:03 AM
Tag:[Customize, MovableType, MTPaginate, Plugin]

Movable Type 4.1 で、MTPaginate プラグインを用いたアーカイブページ(カテゴリーアーカイブ・月別アーカイブ等)のページ分割方法をご紹介します。
4.15でテンプレート構成が変わりそうなので、4.1(厳密には4.0~4.1)限定にしておきます。

ページ分割

このエントリーは「カテゴリーアーカイブと月別アーカイブのページ分割」を MT4.1 用に書き直したものです。

カスタマイズ手順には、PHP化の設定を含んでいます。PHP化の設定を行っていない場合は手順1~手順3を行った後、PHP化したメインページが正常に表示されることを確認してから、手順4以降のページ分割の設定を行ってください。

すでにPHP化が済んでいる場合は、手順5から開始してください。

1.ファイル・ディレクトリのパーミッションを変更

ファイルのパーミッションを変更するために、以下の作業を行ってください。
この作業を行うと、他のアーカイブページのファイルも同じパーミッションになるので、すべてのアーカイブのPHP化(拡張子を.phpにする)が必要です。

まず、mt-config.cgi を FTP ツールでダウンロードし、任意のエディタで開き、行末に以下の内容を追加してください。mt-config.cgi はアプリケーションディレクトリにあります。アプリケーションディレクトリとは、Movable Type をインストールしたディレクトリで、mt.cgi があるところです。

HTMLUmask 0072
DirUmask 0072
HTMLPerms 0777

修正後、mt-config.cgi を保存して、元のディレクトリにアップロードし、メインページを再構築してください。

この設定を行っておけば、出力されるメインページや他のHTMLファイルおよびディレクトリのパーミッションを常に705にします。パーミッションを 775 にする場合は、

HTMLUmask 0022
DirUmask 0022
HTMLPerms 0777

としてください。

2.拡張子の変更

ブログ管理画面の「設定」→「ブログの設定」→「公開」の一番下にある「アーカイブの拡張子」を html から php に変更して「変更を保存」をクリックします。

アーカイブの拡張子

3.XML宣言の修正

ページを XHTML文書、例えば XHTML1.0 として適合させている場合、前項と同じ画面の「テンプレートの内容」の1行目、またはテンプレートモジュールの「ヘッダー」の1行目(またはどこか)に、

<?xml version="1.0" encoding="<$MTPublishCharset$>"?>

という XML 宣言が記述されているケースがあります(記述されていなければこの項目はスキップしてください)。

PHP化を行うと、サーバではこのXML宣言の行をPHPスクリプトとして誤認識してしまい、次のようなPHPエラー

Parse error: parse error, unexpected T_STRING in ~(省略)~index.php on line 1

となるか、500エラーが発生するか、真っ白なページが表示される可能性があります。

このような場合、前述のXML宣言を下記の内容に置き換えてください(ご利用になる際、リストに含まれる改行はすべて除去してください。)。
なお、他のアーカイブページ等も PHP 化されていることを前提にしています。

<MTUnless name="system_template">
<? php echo('
</MTUnless>
<?xml version="1.0" encoding="utf-8"?>
<MTUnless name="system_template">
'); ? >
</MTUnless>

よく分からない場合や、ページが表示されない場合は、このカスタマイズを行う代わりに、XML宣言自体を削除してください。

4.プラグインのダウンロード

MT Extensions より MTPaginate をダウンロード(ページ上の方にある「Download」をクリック)。ファイルは任意のフォルダ(デスクトップ等)に保存します。

5.プラグインのインストール

注:この情報はバージョン1.28のものです。
ダウンロードしたファイルを解凍し、その中の MTPaginate ディレクトリを下記のディレクトリ構成になるように plugins ディレクトリに丸ごとアップロードします。

plugins/MTPaginate/lib/MTPaginate.pm
plugins/MTPaginate/MTPaginate.pl

ブログ管理画面の「システム」→「プラグイン」で MTPaginate が表示されれば、プラグインのインストールは完了です。

プラグイン一覧

6.ページ分割の設定

ブログ管理画面より、「デザイン」→「テンプレート」→「アーカイブテンプレート」→「ブログ記事リスト」を選択し、青色部分のページ分割用タグを設定します。デフォルトテンプレート/配布テンプレート共通です。

一見複雑にみえますが <MTEntries> の直前と </MTEntries> の前後に加えるだけです。

すべてのアーカイブにページ分割を設定する場合

    :
<MTIf name="datebased_archive">
  <MTPaginate>
    <MTPaginateContent max_sections="5">
    <MTEntries>
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
<$MTPaginateSectionBreak$>
    </MTEntries>
    </MTPaginateContent>
    <MTPaginateIfMultiplePages>
    <p class="paginate">
      <MTPaginateIfPreviousPage_>
      <a href="<$MTPaginatePreviousPageLink$>">&#65308;</a>
      </MTPaginateIfPreviousPage_>
      <$MTPaginateNavigator style="links" format_all="All pages" place_all="after" separator=" | ">
      <MTPaginateIfNextPage_>
      <a href="<$MTPaginateNextPageLink$>">&#65310;</a>
      </MTPaginateIfNextPage_>
    </p>
    </MTPaginateIfMultiplePages>
  </MTPaginate>
<MTElse>
  <MTPaginate>
    <MTPaginateContent max_sections="5">
    <MTEntries limit="auto">
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
<$MTPaginateSectionBreak$>
    </MTEntries>
    </MTPaginateContent>
    <MTPaginateIfMultiplePages>
    <p class="paginate">
      <MTPaginateIfPreviousPage_>
      <a href="<$MTPaginatePreviousPageLink$>">&#65308;</a>
      </MTPaginateIfPreviousPage_>
      <$MTPaginateNavigator style="links" format_all="All pages" place_all="after" separator=" | ">
      <MTPaginateIfNextPage_>
      <a href="<$MTPaginateNextPageLink$>">&#65310;</a>
      </MTPaginateIfNextPage_>
    </p>
    </MTPaginateIfMultiplePages>
  </MTPaginate>
</MTIf>
    :

日付ベースのアーカイブのみページ分割を設定する場合

    :
<MTIf name="datebased_archive">
  <MTPaginate>
    <MTPaginateContent max_sections="5">
    <MTEntries>
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
<$MTPaginateSectionBreak$>
    </MTEntries>
    </MTPaginateContent>
    <MTPaginateIfMultiplePages>
    <p class="paginate">
      <MTPaginateIfPreviousPage_>
      <a href="<$MTPaginatePreviousPageLink$>">&#65308;</a>
      </MTPaginateIfPreviousPage_>
      <$MTPaginateNavigator style="links" format_all="All pages" place_all="after" separator=" | ">
      <MTPaginateIfNextPage_>
      <a href="<$MTPaginateNextPageLink$>">&#65310;</a>
      </MTPaginateIfNextPage_>
    </p>
    </MTPaginateIfMultiplePages>
  </MTPaginate>
<MTElse>
    <MTEntries limit="auto">
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
    </MTEntries>
</MTIf>
    :

日付ベース以外のアーカイブのみページ分割を設定する場合

    :
<MTIf name="datebased_archive">
    <MTEntries>
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
    </MTEntries>
<MTElse>
  <MTPaginate>
    <MTPaginateContent max_sections="5">
    <MTEntries limit="auto">
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
<$MTPaginateSectionBreak$>
    </MTEntries>
    </MTPaginateContent>
    <MTPaginateIfMultiplePages>
    <p class="paginate">
      <MTPaginateIfPreviousPage_>
      <a href="<$MTPaginatePreviousPageLink$>">&#65308;</a>
      </MTPaginateIfPreviousPage_>
      <$MTPaginateNavigator style="links" format_all="All pages" place_all="after" separator=" | ">
      <MTPaginateIfNextPage_>
      <a href="<$MTPaginateNextPageLink$>">&#65310;</a>
      </MTPaginateIfNextPage_>
    </p>
    </MTPaginateIfMultiplePages>
  </MTPaginate>
</MTIf>
    :

日付ベース以外のアーカイブのみページ分割を設定する場合、MTEntries タグにある

limit="auto"

は削除した方がいいでしょう。
limit モディファイアに auto を設定した場合、表示するブログ記事数を、「設定」→「ブログの設定」→「ブログ記事」→「ブログ記事の表示数」にあわせます。

7.表示ブログ記事数の設定

リスト中の、

<MTPaginateContent max_sections="5">
<MTEntries>

にある

max_sections="5"

は、1ページに表示する最大ブログ記事数を設定します。ここでは5つのブログ記事表示する設定にしています。

ブログ記事数が30ある場合、max_sections が1ページに5ブログ記事ずつ表示する設定になっているので、ページは計6ページに分割して表示することになります。

8.スタイルの設定

赤色の p 要素はスタイルを設定するために付与しています。必要に応じて下記のようなCSSをスタイルシートに追加してください。

.paginate {
    text-align: center;
    font-size: 9px;
}

設定が完了したら保存し、再構築します。
これで各アーカイブページがページ分割されていることを確認してください。

9.ページリンクの設定

ページリンクは冒頭のスクリーンショットのように表示され、各ページへのリンクと現在のページから前後のページへジャンプするのリンク、および全ページを一括表示するリンクがあります。

各ページのリンクの現在のページはテキスト表示になります。また一番最初のページは「<」を表示せず、最後のページは「>」を表示しません。

上のサンプルではページリンクをページの一番下に表示するように配置していますが、ページの上に表示したい場合は、

     :
<MTPaginate>
<MTPaginateIfMultiplePages>
<p class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>">&#65308;</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator style="links" format_all="All pages" place_all="after" separator=" | ">
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>">&#65310;</a>
</MTPaginateIfNextPage_>
</p>
</MTPaginateIfMultiplePages>
    <MTPaginateContent max_sections="5">
    <MTEntries>
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
<$MTPaginateSectionBreak$>
    </MTEntries>
    </MTPaginateContent>
  </MTPaginate>
     :

と、青色部分を追加してください(すべてのアーカイブに適用させる場合は、上のリストを日付アーカイブベースのサブテンプレートと、それ以外のサブテンプレートの2ヶ所に設定してください)。上下両方にページリンクを付与することも可能です。

注意点としては、ページリンクを必ず MTPaginate タグと MTPaginateContent タグの間に設定してください。誤って MTPaginate の上に設定すると再構築エラーになり、MTPaginateContent の下に貼り付けると再構築はできますが、何も表示されなくなりますのでご注意ください。

2008.04.25
カスタマイズ手順に PHP 化の手順を追加し、手順の順番を見直しました。

2008.08.06
1項の文言を一部削除しました。

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


トラックバック

一日ひきこもりday。 from White Wing version2.0
今日は、一日家にひきこもりの一日でした。チビが金曜日から熱をだして、昨日は39.... [続きを読む]

Tracked on May 25, 2008 8:44 PM

blogのページ分割 from icecraft blog -旅と音楽とインテリア-
blogのphp化をするなら是非実施したいページ分割。 カテゴリーアーカイブにて... [続きを読む]

Tracked on June 23, 2008 10:28 PM
コメント

お世話になっています。
カテゴリーアーカイブと月別アーカイブのページ分割で
テンプレのどこに記述したらよいか質問させて頂いたすずしろです。

こちらを参考に、無事にページ分割させることができました。
本当にありがとうございました。

[1] Posted by すずしろ : April 11, 2008 2:29 PM

>すずしろさん
こんばんは。
ご連絡ありがとうございました。
うまくできたようでよかったです。
ではでは!

[2] Posted by yujiro logo : April 13, 2008 3:17 AM

ちょうどこういった分割プラグイン探してました!
ありがとうございます。

チュートリアルだと  All Pages | 1 | 2 | 3 | 4 | 5 |
というすべてのページが表示されますが

こんな感じにもできますでしょうか?

All Pages ... 3 | 4 | 5 | 6 | 7 ...

セレクトされた番号に沿って前後のページ番号が省かれページ数が多くても
シンプルに表示できる方法があれば教えていただけないでしょうか。。。

[3] Posted by AKIKO : April 13, 2008 1:33 PM

>AKIKOさん
こんにちは。
ご質問の件ですが、デフォルトではそのような機能がありません。
時間をみてカスタマイズしてみますので、うまくできるようであれば別途エントリー致します。
気長にお待ちください。
それではよろしくお願い致します。

[4] Posted by yujiro logo : April 16, 2008 5:19 PM

yujiroさま

お世話になります。

すいません。ひとつ教えてください。

MT4における検索ページのページ分割は、3.3と同じ様に設定すればよろしいのでしょうか?

[5] Posted by mamyu logo : July 6, 2008 10:18 PM

>mamyuさん
こんにちは。
ご返事遅くなり申し訳ありません。
ご質問の件ですが、検索結果のページ分割は、MTPaginateを利用する場合は、MT4.0~4.1であれば、MT3.3と同様の設定(下の記事)という認識です。

検索結果のページ分割(3.3x 版)

それではよろしくお願い致します。

[6] Posted by yujiro logo : July 14, 2008 1:11 PM

>yujiroさま

ありがとうございます。

[7] Posted by mamyu logo : July 16, 2008 7:20 PM

いつも参考にさせて頂いてます。

さて、MT4.1にてアーカイブのページ分割を試みているのですが、分割されたリンクを表示する所までは問題なかったのですが、いざクリックすると「mt-dynamic.php」が見つからない為にエラーになってしまいます。
どうやらアーカイブの現時点の場所でmt-dynamic.phpを探してるようです。

カテゴリ「ABC」の場合、
「hoge.com/ABC/mt-dynamic.php」 を探してる。
(実際はhoge.com/mt-dynamic.php)

記述の仕方はこのページの通りなのですが、これはそもそもブログの設定の問題でしょうか?
お暇なときにご意見頂けると幸いです。

[8] Posted by kei : August 3, 2008 4:19 AM

>keiさん
こんばんは。
ご質問の件ですが、mt-dynamic.php ということは、Perl版ダイナミックパブリッシングを利用されているのでしょうか。
当方では申し訳ありませんが動作未確認です(藤本さんに確認されることをお勧めします)。
それではよろしくお願い致します。

[9] Posted by yujiro logo : August 4, 2008 1:29 AM

>yujiro様
返信ありがとうございます。
とりあえずページ分割は別の方法で処理することにしました。
お手間を取らせました。スイマセン。

[10] Posted by kei : August 4, 2008 4:56 AM

第1項の
「すべてのアーカイブのPHP化(拡張子を.phpにする)が必要」
というのを具体的に教えて頂けませんでしょうか。

index.html のみ index.php にし、
index.phpにアクセスすると正しく分割されてるようなのですが
他のページに飛ぶと分割表示がされないので、
上記が原因かと考えています。

どうぞよろしくお願いいたします。

[11] Posted by LION : August 5, 2008 10:16 PM

>LIONさん
こんにちは。
ご質問の件ですが、2項・3項の作業を行えば、すべてのアーカイブページがPHP化されたことになります。全アーカイブの再構築を行ってもページ分割がされていない場合は、該当のアーカイブテンプレートにページ分割の設定がされていないことが考えられます。

なお、くだんの2行はこちらの認識誤り(パーミッションが変わっても拡張子がhtmlであればPHP化されていないHTMLページとなります)なので、削除致します。
それではよろしくお願い致します。

[12] Posted by yujiro logo : August 6, 2008 9:41 AM

とても役立つ情報、本当にありがとうございます。感謝です。

教えていただきたいのですが、カテゴリページだけをPHP化で分割し、その他のアーカイブページ(日別とか月別とか)はHTMLファイルのまま分割しない、というような事はできるのでしょうか?

[13] Posted by なが : September 12, 2008 1:35 PM

>ながさん
こんばんは。
ご質問の件は可能だと思います。

おおざっぱな解説ですいませんが、カテゴリ用のブログ記事リストと他のブログ記事リストを別々に作成し、アーカイブのパスの末尾に .html または .php を直接記述すれば良いと思います。
ページ分割の設定はカテゴリ用のブログ記事リストにだけ設定します。

それではよろしくお願い致します。

[14] Posted by yujiro logo : September 15, 2008 11:13 PM

いつも参考にさせてもらってます。

ページ分割目的でPHPかしてる最中なのですが
3まで終わった時点(宣言書き換え後)で
ヘッダーの最上部に↓
'); ? >
↑この様な表示が出たのですが消す方法はあるのでしょうか?

[15] Posted by keiichi : September 19, 2008 10:37 AM

↑の投稿は自己解決しました。

宣言文書き換えじゃなくて宣言文消去で行けました。
お騒がせ申し訳ありませんでした。

[16] Posted by keiichi : September 19, 2008 4:32 PM

>keiichiさん
こんばんは。
ご連絡ありがとうございました。
ご質問の件、自己解決されたようで良かったです。
ではでは!

[17] Posted by yujiro logo : September 20, 2008 12:50 AM

4.2で、ページ分割を試してみたのですが、月別アーカイブは問題なくページ分割できたのですが、カテゴリーアーカイブはできませんでした。
やはり、4.2ではだめなのでしょうか?それとも、なにか設定上のミスがあるのでしょうか。

[18] Posted by mave : October 1, 2008 4:31 AM

>maveさん
こんにちは。
ご質問の件ですが、本記事のページ分割はアーカイブの種別によらず、分割可能です。
頂いた情報だけでは何が問題か判断できませんが、設定ミスか、表示するブログ記事数が少ないかのどちらかと思われます。
それではよろしくお願い致します。

[19] Posted by yujiro logo : October 2, 2008 9:53 AM

情報の乏しい稚拙な質問をしてしまいすみませんでした。MTを使うのは始めてで、思い通りにならないことが多く、疲れて勢いでコメントしてしまいました。
>表示するブログ記事数が少ない
このあたり、くさいので再度チェックしてみます。ありがとうございました。

[20] Posted by mave : October 2, 2008 8:58 PM

>maveさん
こんにちは。
ご連絡ありがとうございました。
うまく分割できないようであれば、サイトのURLをご連絡頂ければ拝見させて頂きます。
それではよろしくお願い致します。

[21] Posted by yujiro logo : October 3, 2008 1:02 PM

すみません。コメントの返信気づきませんでした。サイト閲覧のお申し出ありがとうございます。ページ分割はプラグインで対処することにしました。

[22] Posted by mave : October 18, 2008 10:00 AM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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