: Movable TypeでPHPダイナミックパブリッシングとキャッシュとページ分割を同時に利用する方法

買い物ログ: カテゴリ・アーカイブをページ分割しました

 を参考に・・・要するにPHPなんだからスクリプト書けばページ分割ぐらいすぐですよ。という話ですが、ただ、キャッシュ機能までONにしてしまうとキャッシュされてしまうため、ページの動的分割がうまくいかない。そこで回避方法。

まずはページ分割

<MTEntries lastn=”10″ offset=”`$smarty.request.page*10`”>

 基本はMTEntries タグにlastnで1ページ当たりのエントリ数と、offsetで$smarty.request.pageでページの最初のエントリのオフセットを入力。
 今回は1ページ当たり10エントリとするので、lastnは10。オフセットでページ数を10倍する。

 基本的にはこれだけで、分割可能。(オリジナルソースとは若干変わってます)

ナビゲーション

<p> {{capture assign="count"}}<$MTCategoryCount$>{{/capture}}
{{if $smarty.request.page*10 < $count-10 }}
<
a href="?page={{$smarty.request.page+1}}">&laquo;&laquo;より過去のページ </a>
{{if $smarty.request.page != 0 }} | {{/if}}
{{/if}}

{{if $smarty.request.page > 0}}
<
a href="/">最新のページ</a>|
<
a href="?page={{math equation="max(x-10,0)" x=$smarty.request.page
}}">より最近のページ&raquo; &raquo; </a>
{{/if}}
<
/p>

 お好みの位置にナビゲーションを置くのもオリジナルと同じです。オリジナルではoffsetとなっているところをpageに変えてあります。

 また、時系列を 右側を過去、左側を未来に変えてあります。

ページ分割はキャッシュしない

 さて、ここで困ってしまうのが、MTのキャッシュ機能をONにしていると、1ページ目がキャッシュされてしまうために2ページ以後は1ページ目が表示されてしまうという問題です。だからといって、キャッシュをOFFにしてしまうとRSSや他のページまでキャッシュされなくなってしまい動作が非常に重くなってしまいます。

 そこで、こういった?付きの本当に、本当な?動的ページのみキャッシュせず、RSSなど他のダイナミックページはキャッシュさせる事にしました。

 この対処は簡単で

<?php
$mt = new MT(2);
if(strpos($_SERVER[‘REQUEST_URI’],’?’)===false){
$mt->caching = true;
}
$mt->view();
?>

 ダイナミックパブリッシングに使っているmtview.phpを修正します。

 修正はごく簡単な物で、$_SERVER[‘REQUEST_URI’],を使ってURL中に?が含まれていなければ、キャッシュする。含まれていればキャッシュしない。という単純なロジックに変更します。

 おおよその場合、これで、ページ分割など、スクリプトで分岐する物については本当に動的に、それ以外の物はキャッシュをする半動的という風に処理されます。

参考

 買い物ログ: カテゴリ・アーカイブをページ分割しました
 Don’t Back Down: Pagination Using Smarty

Comment

  1. 【Movabletype】プラグインなしでページ分割【これはすごい】

    余りに目ウロコというか効果絶大でした。 Movable TypeでPHPダイナミ…

  2. いちろう より:

    1年ほど前、ダイナミックでキャッシュが使えない壁にぶち当たったのですが、これで解決です。とはいうものの、違う理由で、いまはスタティックで運用しています。レンタルサーバのMySQLの低性能さ加減と再構築時のタイムアウト(ダイナミックは記事数が増加してくるとタイムアウトエラーが頻発するようです。)

    ご教授ありがとうございました。

  3. WingMemo より:

    頁分割とキャッシュの両立

    当方のダイナミックではSmartyを用いた頁分割を行っています。が、この方法は「ページレベルのキャッシング」を有効にすると上手く動いてくれません。といって…

  4. バリごと。 より:

    カテゴリーと月のアーカイブのページを分割した。

    カテゴリーと月別アーカイブ(←サイドバーに表示されている)のページを分割した。何…

  5. La Petite Note より:

    Movable Type 4.2 にバージョンアップ

    Movable Type 4.2 がリリースされていることはわかっていたのだけど…

Leave a Reply

メールアドレスが公開されることはありません。

注意(NOTICE)

コメントの投稿は反映までに時間がかかる場合があります。 Post Comments may take some minutes to publish.