top

ダイナミック・パブリッシングで頁分割(1)

ダイナミックでは頁分割は出来ないものだと思い込んでいましたが、実は出来ることが判明しました!

invisible blog 分割でお願いします
買物ログ カテゴリー・アーカイブを分割しました

それによると、実はダイナミック・パブリッシングにはもともと頁分割機能があった!?
ええええええ!!(驚)

さっそく試してみました。これはダイナミック・パブリッシングに備わっている能力を利用して頁分割を行うものなので、プラグインも要りませんし、拡張子をphpにする必要もありません。htmlのまま、いとも簡単にサクッと動きます。これは凄いッッ!

以下は自分のための覚え書きです。

■月別アーカイブの頁分割
まずは<MTEntries>を以下の記述で置き換えます。

 {{assign var="epp" value=5}}
<MTEntries lastn="5" offset="`$smarty.request.offset`">

赤字の数字の部分で1頁に表示する件数を決めます。2か所とも同じ数字にして下さい。

次に、頁分割を表示させたい箇所に以下の記述を追加します。
これはinvisible blogのYuyaさんが分割でお願いしますで書かれていたスクリプトをちょっとだけアレンジしたものです(中身は分からないので、左右の矢印部分の記号を少し変えただけです^^;)。

<!-- 頁分割ここから -->
{{capture assign="count"}}<$MTArchiveCount$>{{/capture}} {{if $count > $epp}}
{{if $smarty.request.offset > 0}}
<a href="?offset=0">&laquo;</a>
<a href="?offset={{$smarty.request.offset-$epp}}">&lt;</a>
{{else}}
&laquo; &lt;
{{/if}}

|

{{math equation="(x-1)/y+1" x=$count y=$epp assign="numloop"}}
{{section name=npage loop=$numloop}}
{{if $smarty.request.offset+1 < ($smarty.section.npage.index+1)*$epp &&

$smarty.request.offset+1 > $smarty.section.npage.index*$epp }}
{{$smarty.section.npage.index+1}}
{{else}}
<a href="?offset={{$smarty.section.npage.index*$epp}}">

{{$smarty.section.npage.index+1}}</a>
{{/if}}

{{if $smarty.section.npage.last != 1}} |
{{/if}}
{{/section}}
|
{{if $smarty.request.offset < $count-$epp}}
<a href="?offset={{$smarty.request.offset+$epp}}">&gt;</a>
<a href="?offset={{math equation="floor((x-1)/y)*y" x=$count y=$epp}}">&raquo;</a>
{{else}}
&gt; &raquo;
{{/if}}


{{/if}}
<!-- 頁分割ここまで -->

表示見本 « < | 1 | 2 | 3 | 4 | > »

青字の部分が両側の « <  > » にあたります。左右の矢印は要らない、数字だけ | 1 | 2 | 3 | 4 | な感じで表示されればいいという人は青字の部分を消せばOKです。

*その月のエントリー数が1頁に表示させる件数より少ない場合は分割リンクは表示されません。

■カテゴリーアーカイブの頁分割
<$MTArchiveCount$><$MTCategoryCount$>に変更。

■トップ頁の頁分割
<$MTArchiveCount$>50 など好きな数字に変更。
ここで決めた数のエントリーが分割されて表示されます。

なお、任意の数字ではなく<$MTBlogEntryCount$>にすると、全てのエントリーを分割して表示することができます。覚えておくと便利だと思います。

こんなに簡単に頁分割が出来るんだったら、月別頁復活させてもいいかなあ…。
素晴らしいスクリプトを書いて下さった方々に心より感謝致します。

お知らせ
MT4.2からはSmartyのコードを直接テンプレートに書かなくてもMTタグで頁分割が出来るようになりました。4.2以降をお使いの方はMTタグでの分割も行えます。詳しくはこちらをご覧下さい。(もちろん、この頁の分割方法は4.2でも問題なく使えます)

<注意事項>
●MT3.31をお使いの方へ
MT3.31には月別アーカイブの<$MTArchiveCount$>がダイナミックで正しく出力されないバグがあります。そのため、3.31で月別アーカイブをダイナミック分割する場合は、<$MTArchiveCount$>の部分を任意の数字(31など)に置き換えるか、こちらの方法で対処して下さい。

<2006.8.30 追記・修正>
<2007.8.2 4.0に対応>対応箇所・理由はこちらを参照。
<2008.8.16 追記>4.2でダイナミックが公式に頁分割に対応したことを追記。
<2021 追記>invisible blogにアクセス出来なくなったのでarchive.orgへのリンクに切り替え。

 

トラックバックの一覧

トラックバック Blogカスタマイズ さらに続き  »» 2006年6月14日 00:42
ページ送りのプラグイン『MTPaginate』はダイナミックパブリッシングと同時...
トラックバック カテゴリーと月のアーカイブのページを分割した。  »» 2007年7月18日 19:05
カテゴリーと月別アーカイブ(←サイドバーに表示されている)のページを分割した。何...
トラックバック 静的→動的など、久々にいろいろと変更  »» 2008年3月30日 17:10
まぁ、このPandoraBoxではなくて、物欲ページの方なんですけどね。 記事数...

コメント

最近MTに変えた超初心者です。導入当初、再構築エラーの劣悪ループに入ってしまい。どうしたもんかと悩んだ挙句、ダイナミックパブリッシングというものを知って、アーカイブについては動的生成にしています。
ページ分割の件、目からうろこでしたね。おいらも「invisible blog」さんのところで知って、早速導入しています。ダイナミックの可能性が広がったと思った瞬間でしたよ。
smartyを使いこなせば、プラグインなんて必要ないんじゃないの?とまで考えていますが、貴サイトのように静的生成をうまく組み合わせて既存のPerl版プラグインをも使えるようにしていることについて、今深く感銘しております。
いろいろと参考にさせていただくことが多くて今後ちょくちょく寄らせていただきます。よろしくお願いします。
「ダイナミックパブリッシングに愛を!」(笑)

コメントありがとうございます!
MTには再構築不要で動かせるダイナミックパブリッシングが標準搭載されているのに、意外に広まってない気がするのは不思議ですよね。気が付いてない方が多いのでしょうか(^^;。

私もこのダイナミック用頁分割を知った時は目からうろこでした。これまで広まってきたやり方にとらわれなければ、出来ないことなんてないじゃないかーと思いました。Perl版プラグインも最低限必要なものは十分使えてるし、今はダイナミックで不満なんて何もない、という状態です。標準のタグだけで出来ることも実はけっこうたくさんありますし、ダイナミックならではの使い方を考えるのも楽しいですしね。

こちらこそこれからもよろしくお願いします。
ダイナミックパブリッシングに愛を!の精神で(笑)。

お久しぶりです。
こちらは、あれからかなりパワーアップして、モバイル投稿なんかもできるようにしました。
さて、今回の用件はご機嫌伺いではなく(笑)、ダイナミックにつきもののアクセス応答が悪い件に関係しているのですが、MySQL+ロリポップという環境のせいか、応答が非常に悪いんです。そのため、Six Apartのサイトで見つけた「ページキャッシュ」を設定してみたんですが、そうすると、ページ分割が機能しなくなるんですよ。詳細は、私のサイトにも書いたんですが、誰も取り合ってくれません(泣&笑)。何か情報をお持ちでしたら、ご教示願いたいんですが、いかがでしょ。(お暇なときで結構ですよ。)

こんにちは。ブログもいろいろ頑張られているようですね。

ロリポップのMySQLは遅いとの話はよく聞きます。ロリポップの場合、MySQLは別サーバーにあって大勢の人と共有しているので、負荷状況やアクセスの集中具合で性能が左右されることがあるみたいです。XREAなら自分のアカウント内にMySQLがあるので、いつも高速で安定してますからその心配はないんですが…。
ページキャッシュは試したことがないので分かりませんが、ダイナミックで表示が遅くなるのはやっぱりMySQLのせいだろうと思います。
考えられる解決策としては以下のようなものでしょうか…。

1.頁そのものを軽くする
電話回線でネットしていた時代にはこれがサイトを作る基本事項だったのですが、今は最初から高速回線なのでこの基本に気付かない人も多いようです。サイドバーはなくす、広告など内容に関係ないものも一切排除する、カテゴリ頁は一覧表示にする等、頁そのものが軽くなるよう努力すればMTへの負担も減るので表示スピードも格段に速くなると思います。が、これはサイトの運営方針に関わることなので簡単に実行は出来ないですよね(^^;。

2.MySQLからSQLiteにする
データベースをSQLiteに変更します。ロリポの場合はむしろSQLiteの方がMySQLより反応がいいようです。3.2以上ならSQLiteでもダイナミックが使えるはずなので、試してみる価値はあるのではないでしょうか。これが一番現実的な解決方法かもしれません。

3.MySQLが安定しているサーバーへ引っ越す
究極の選択肢ですが、まあ最後の手段ということで(^^;。XREAなら月200円で1G使えます(笑)。

MTはデータベースを使うので、肝心のデータベースがしっかりしててくれないと辛いところがありますよね。SQLiteへの移行法は検索すればいっぱい出てくると思います。悩みが解決するといいですね。

早速の回答ありがとうございまス。
結局キャッシュはやめました。なぜかページキャッシュとページ分割は両立しないようです。ロリポップMySQLデータベースの非力さにほとほと嫌気がさしておりまして、最近ではエントリーの更新(新規作成ではなくて)時さえ500エラーが出ることがあります。4月にお借りしたばかりなので、あと10ヶ月は我慢して使わなければ…。Xreaってなかなかよさそうですね。独自ドメインなのでドメイン移管さえできればクリアできそうですし。
ちなみにSQLiteへ移行しようとして、Ogawa::Memorandaさんところのツール(mt-db-convert.cgi)で試してみましたが、なぜかエラーが出てしまってデータベースの移行が上手くいきませんでした。うーむ、この世界やればやるほどわからないところが出てきます。( ̄◇ ̄;)

そうですか、ダイナミックのキャッシュは頁分割と両立しないんですね…。キャッシュ使わなくていい環境になれたらいいですよね。

>更新時さえ500エラー
ロリポのMySQLってそんなに弱いんですか…(^^;。
私もロリポで1年修行してからXREAに移りましたので、よろしければどうぞ~(笑)。

SQLiteへ移行された人も多いと思いますから、探せばエラーの原因もきっと分かると思います。上手くいくといいですね。

追記です。
3.31のマニュアルを見て分かったのですが、SQLiteの場合、「バージョン2」でないとダイナミック・パブリッシングは動作しません。SQLiteを使われる場合はサーバーで使えるバージョンに注意して下さい。

お久しぶりです。なるほど、SQLite2じゃないとダイナミックにできないんですね。3.2も一緒かな~。
あれからデータベースをSQLiteに変えて快適です。その代わり今は完全にスタティック運用していて、しかも3.2のままですが。もう、いろいろいじるのは辞めましたよ。そんなことに時間かけるのがアホらしくて。てか内容に力を入れなければね~( ̄◇ ̄;)
あ、バージョンはロリポサーバに確認すれば分かりますね。2だったらまたダイナミックに挑戦してみます。

お久しぶりです~。

>SQLite2
3.2でもそうだったのかもですね。2が使えるようになったらまた挑戦してみて下さい。

ところでSQLiteをお使いなら、3.31へのアップグレードは少し様子見した方がいいようです。
http://as-is.net/blog/archives/001147.html
結局、MTはMySQLが安定しているところが一番なのかもですね。。。

あれから、ロリポップさんに問い合わせたところ、SQLite1.08だそうで( ̄◇ ̄;)。
ダイナミックとMT3.31バージョンアップはしばらく見合わさざるを得ないようです。ショボン…。

そうでしたか。。。
私のところもSQLiteみたいです。バージョンアップはあわてなくてもいいと思うので、特に欲しい新機能がなければバグ対応版が出るまで待つのもいいと思いますよ~。

<2007.2.20 追記>
2007.2.17からXREAではSQLite2が使えるようになりました。

お久しぶりです&いつもお世話になってます♪
こちらのサイトを見ながら、私のブログも色々とカスタマイズしてます。おかげで大分使い勝手が良くなりました。(笑)

ところで、私のMTも3.34にしたのですが、デフォルトブログでももう一つのブログでもこちらで紹介しているページ分割がうまく行えないんです。現象は、どのページをクリックしてもページが移動しません。(URL出しておきます。)

バージョンアップの仕方が悪かったのかな?と思ったので、MTを一度全部削除して3.34を新規インストールをしましたが、改善されませんでした。

TAEKOさんと同じサーバーなので、このままコピーすれば出来ると思っていたのですが…原因が全然分かりません。何か問題点など、思いつく部分がありましたら教えていただけますか?

>ぢゅんり♪さん
こんばんは。^^
もしかして「ページ・レベルのキャッシング」を有効にされていませんか?
実はこのキャッシュ機能、頁分割と両立しないんです。ダイナミックでキャッシュを使う設定にすると、この現象がおこりますので、当ブログではキャッシュは使わず「条件付きリクエスト」の方を採用しています。ご確認下さい。

やっと出来ましたー!!(*T▽T*)

調べてみたら「ページ・レベルのキャッシング」がやっぱり有効になってました。マニュアル通りに「条件付きリクエスト」の設定をしたのですが、最初、ローカルで書き換えてftpでupしたものの、mtview.phpが再構築の度に書き換えられてしまうので、散々調べた末に管理画面のテンプレートを覗いたら、mtview.phpの修正画面が…(⌒_⌒;)

修正して再構築したら…今度は成功しました♪

これで安心して次に進めます。本当に助かりました。ありがとうございます!

>「ダイナミックパブリッシングに愛を!」
この言葉で、自分のサーバーを自分の子供の様に扱ってみようと思ったんですよ。おかげで、サーバーに愛着が付いてストレスが減りました。( ̄▽ ̄;)ゞ

>ぢゅんり♪さん
やっぱりキャッシュが有効になってましたか。解決できてよかったです。

>>「ダイナミックパブリッシングに愛を!」
そうなんですよね、愛着があれば少々の癖なんて「そういうものだ」で気にならなくなるし、使いこなすのも楽しみになります。ダイナミックの良さ、もっと広まっていってほしいものです。

TAEKO様
初めまして。こんにちわ。
さてネット検索でやって参りました。ず~っと、ページ送り機能のものを探していたのです。で、やっと見つかったぁ~!と喜び勇んだのですが、撃沈。
やはりTypepadでは無理なのでしょうか。smartyなるものが無いのでしょうか?それともMTと言語がどっか違っているのでしょうか?
もしお分かりになることがあれば些細なことでも構いませんのでどうか教えてくださいませ。いかんせん、テック音痴のブログ初心者なもので(笑)。
どうぞ宜しくお願いします。

>yoichiさん
こちらこそ初めまして。
ところで、せっかく来ていただいたのに申し訳ありません…。この頁送りはMTのダイナミック・パブリッシング(動的生成)専用のカスタマイズなのです。MTにはWordPressのような頁の動的生成機能がありまして、このブログはそれで動かしているのです。

Typepadは静的生成のみだったと思いますので、このコードは使えないと思います。MTの場合、静的生成ではMTPaginateというプラグインを使うのですが、Typepadが対応してなければ難しいと思います。お力になれなくてすみません。

TAEKO様
早速にありがとうございます。
そうっすかぁ。残念です。けれどもすごく勉強になるサイトなのでこれからもちょくちょく寄らせてもらいます!

>yoichiさん
TypepadとMTでは共通で使えるカスタマイズもありそうですね。
MT&ダイナミック用サイトですが、よろしくお願い致します。

ちょーおひさしぶりぶりでございます。

今回は、ダイナミックとページキャッシュの両立が可能になる解決策が、約1年ぶりに判明しましたので、ご報告です。↓

レビログ:「Movable TypeでPHPダイナミックパブリッシングとキャッシュとページ分割を同時に利用する方法」(http://revilog.com/2007/05/010715.html)

この中で紹介されているのは、mtview.phpのスクリプトに1行(if文)書き加えるだけで、ページ分割するコンテンツのみをページキャッシュ無効にするワザのようです。

>いちろうさん
こんにちはー^^

情報ありがとうございます!
なるほど、こんな簡単な記述だけで両立させる方法があったのですね。
キャッシュは使いたいけど頁分割も使いたい人には朗報ですね!
あとでどこかに追記するかエントリー立てるかして記録しておこうと思います。

はじめまして。いつも参考にさせていただいています。
ダイナミック・パブリッシングに変更したばかりであまり理解できていないので、質問させてください。

MTOS4.1を使用しており、アーカイブページをダイナミック・パブリッシングで出力しているのですが、なぜか{{assign var="epp" value=5}}やスクリプトのソースがページに表示されてしまい機能しません。

アーカイブページごとにレイアウトが違うので、『ブログ記事リスト』にで条件分岐させてテンプレートモジュールを読み込ませています。
特定のモジュールのみページ分割をしたいので、モジュールにソースを書いていたのですが、それでは機能しないのでしょうか?

よろしくお願いします。

>おかださん
しばらく留守にしていたため、お返事が遅れてすみません。
静的生成だとスクリプトのソースがそのまま表示されますので、ダイナミック設定になっているのは間違いないでしょうか?
現在4.1環境がないので確認できないのですが、4.23ではモジュールに分割ソース書いても機能したと思います。

今ちょっと諸事情で忙しくしているので、詳しい検証が出来なくて申し訳ないですが、モジュールなしでテンプレに直接書いた場合は機能するかどうかなどいろいろ試して、ソースが表示される条件を絞り込んでみて下さい。

TAEKO様

ご返事ありがとうございます。

>静的生成だとスクリプトのソースがそのまま表示されますので、ダイナミック設定になっているのは間違いないでしょうか?

上記のコメントを見て気がついたのですが、使用しているプラグインの関係で『Perl版ダイナミック・パブリッシング』のプラグインをインストールしているのを忘れていました…
MT本来のダイナミック・パブリッシングではなかったから機能しなかったのですね。(汗)
お騒がせしてすみません、ありがとうございました!

>おかださん
あ、Perl版の方だったんですね。
この分割はPHPのSmartyで動かしていますので、Perlでは動かないです。
そういうことでよろしくお願いします~。