MT4.2からはダイナミック・パブリッシングに公式な頁分割が提供されることになりました。つまりデフォルトでMTタグで頁分割が出来るようになったということです。
この機会に公式版での分割コードをいろいろ試してみたので、覚え書きしておきます。MTタグになったおかげでプログラムをよく知らない者でも複雑な分割制御が出来るようになりました。また、Smartyのコードを直接テンプレートに貼りつけなくてもよくなったので、テンプレートの見通しもよくなりました。
1.1頁に表示させる件数の設定
公式頁に書いてある通りですが、少し補足も。
通常のページ分割
<MTEntries>を以下のようにします。赤字の部分に1頁に表示させたい記事数を入れます。トップ頁、カテゴリ、日付どれでも共通です。
<MTEntries limit="5" offset="auto">
カテゴリアーカイブでサブカテゴリ以下の記事も含めて分割
<MTEntries>を<MTEntriesWithSubCategories>に変更します。赤字の部分に1頁に表示させたい記事数を入れます。
<MTEntriesWithSubCategories limit="5" offset="auto">
4.1以前はこんなに苦労していたものが、たったこれだけで出来るように(^^;。
2.分割用コード
●サンプル1 « Previous | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Next »
公式頁の見本を元に区切り線をつけてみたもの。もっとも基本的な分割サンプルです。
<MTIfPreviousResults> <a href="<MTPreviousLink>" rel="prev">« Previous</a> </MTIfPreviousResults> | <MTPagerBlock> <MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage> <MTUnless name="__last__"> | </MTUnless> </MTPagerBlock> | <MTIfMoreResults> <a href="<MTNextLink>" rel="next">Next »</a> </MTIfMoreResults>
●サンプル2 « 前へ | 次へ »
前後リンクだけを出したもの。好みで「前の○件」などにするのもいいかと。
<MTIfPreviousResults> <a href="<MTPreviousLink>" rel="prev">« 前へ</a> </MTIfPreviousResults> | <MTIfMoreResults> <a href="<MTNextLink>" rel="next">次へ »</a> </MTIfMoreResults>
●サンプル3 « 1 / 20 »
「今の頁/全頁」というパターン。他のバリエーションと組み合わせるなど工夫もいろいろ出来ます。
<MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev"> «</a> </MTIfPreviousResults> <MTPagerBlock> <MTIfCurrentPage><MTVar name="__value__"></MTIfCurrentPage> <MTIf name="__last__"> / <MTVar name="__value__"></MTIf> </MTPagerBlock> <MTIfMoreResults> <a href="<MTNextLink>" rel="next"> »</a> </MTIfMoreResults>
●サンプル4
プルダウン表示用です(この見本からは飛びませんのでご注意下さい)。
<select onchange="nav(this)"> <MTPagerBlock> <option value="<MTPagerLink>"<MTIfCurrentPage> selected="<MTVar name="__value__">"</MTIfCurrentPage>><MTVar name="__value__"></option> </MTPagerBlock> </select> <script type="text/javascript" charset="<$MTPublishCharset$>"> function nav(sel) { if (sel.selectedIndex == -1) return; var opt = sel.options[sel.selectedIndex]; if (opt && opt.value) location.href = opt.value; } </script>
●サンプル5 « Previous | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Next »
表示見本ではちょっと分かりにくいですが、指定したページ数だけ分割表示するカスタマイズです。トップ頁などで、全部分割しなくてもいいから、最新から10頁分だけ表示できればいい、という場合に。赤字の部分でページ数を指定します。
<MTIfPreviousResults> <a href="<MTPreviousLink>" rel="prev">« Previous</a> </MTIfPreviousResults> | <MTPagerBlock> <MTIf name="__value__" le="10"> <MTIfCurrentPage> <MTSetVarBlock name="pageno"><MTVar name="__value__"></MTSetVarBlock> <MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a> </MTIfCurrentPage> | </MTIf> </MTPagerBlock> <MTIfMoreResults> <MTIf name="pageno" lt="10"> <a href="<MTNextLink>" rel="next">Next »</a> </MTIf> </MTIfMoreResults>
●サンプル6 « Previous 4 5 6 7 8 9 10 11 12 13 Next »
常に10頁分を表示します。トップ頁またはページ数がすごく多いアーカイブ向きのカスタマイズ。例えば、トップ頁に基本の方法でページ分割を行うと、全ての頁を分割表示してしまうため、記事数が何百~何千もあるブログではページ数が膨れ上がって大変なことになります。全部の記事を分割したいけど、スペースは節約したいという場合に。
<MTSetVarBlock name="pageno"><$MTCurrentPage$></MTSetVarBlock> <MTPagerBlock> <MTIf name"__last__"><MTSetVarBlock name="last"><MTVar name="__value__"></MTSetVarBlock></MTIf> </MTPagerBlock> <MTSetVarBlock name="last2"><MTGetVar name="last" value="5" op="-"></MTSetVarBlock> <MTIf name"pageno" ge="5"> <MTIf name="pageno" le="$last2"> <MTSetVarBlock name="from"><MTVar name="pageno" value="5" op="-"></MTSetVarBlock> <MTSetVarBlock name="to"><MTVar name="pageno" value="4" op="+"></MTSetVarBlock> <MTElse> <MTSetVarBlock name="from"><MTGetVar name="last" value="9" op="-"></MTSetVarBlock> <MTSetVar name="to" value="$last"> </MTIf> <MTElse> <MTSetVar name="from" value="1"><MTSetVar name="to" value="10"> </MTIf> <MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">« Previous</a> </MTIfPreviousResults> <MTPagerBlock> <MTIf name="__value__" ge="$from"><MTIf name="__value__" le="$to"> <MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage> </MTIf></MTIf> </MTPagerBlock> <MTIfMoreResults><a href="<MTNextLink>" rel="next"> Next »</a> </MTIfMoreResults>
なお、最新から10頁以内は 1 2 3 4 5 6 7 8 9 10 Next »
となり、11頁目から現在の頁を中心とした前後10頁表示になります。
最後から10頁以内に入ると « Previous 11 12 13 14 15 16 17 18 19 20
という表示になるよう制御しています。
●サンプル7 « Previous 1 ... 4 5 6 7 8 9 10 11 12 ... 20 Next »
最初と最後の頁を常に表示しながら、現在の頁を中心に常に9件表示します。これもトップ頁や記事数の多いアーカイブ向きのカスタマイズです。
<MTSetVarBlock name="pageno"><$MTCurrentPage$></MTSetVarBlock> <MTPagerBlock> <MTIf name"__last__"><MTSetVarBlock name="last"><MTVar name="__value__"></MTSetVarBlock></MTIf> </MTPagerBlock> <MTSetVarBlock name="last2"><MTGetVar name="last" value="5" op="-"></MTSetVarBlock> <MTIf name"pageno" ge="5"> <MTIf name="pageno" le="$last2"> <MTSetVarBlock name="from"><MTVar name="pageno" value="4" op="-"></MTSetVarBlock> <MTSetVarBlock name="to"><MTVar name="pageno" value="4" op="+"></MTSetVarBlock> <MTElse> <MTSetVarBlock name="from"><MTGetVar name="last" value="8" op="-"></MTSetVarBlock> <MTSetVar name="to" value="$last"> </MTIf> <MTElse> <MTSetVar name="from" value="1"><MTSetVar name="to" value="9"> </MTIf> <MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">« Previous</a> </MTIfPreviousResults> <MTPagerBlock> <MTIf name="to" gt="9"> <MTIf name"__first__"><a href="<MTPagerLink>"><MTVar name="__value__"></a> ... </MTIf> </MTIf> <MTIf name="__value__" ge="$from"><MTIf name="__value__" le="$to"> <MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage> </MTIf></MTIf> <MTIf name="to" lt="$last"> <MTIf name"__last__"> ... <a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIf> </MTIf> </MTPagerBlock> <MTIfMoreResults><a href="<MTNextLink>" rel="next"> Next »</a> </MTIfMoreResults>
サンプルでは数字と数字の間はスペースで調整しているのが多いですが、お好みでcss装飾に変えても。
<2008.8.23>コードの重複ミスを修正。
<2008.11.17>サンプル2のMTタグのスペルミスを修正。
コメント
くまっち | 2008年8月23日 12:28
サンプル1の最後の二行ダブっているようです。何も考えず貼り付けたらエラーが出たので最初渋りましたw。ご確認いただけましたらこのコメントは削除して頂いてかまいません。でわでわ
TAEKO | 2008年8月23日 14:34
こんにちは。
うわあ!ダブってますね(汗)。後で修正しておきます。
ありがとうございました!
どら | 2008年9月11日 15:50
こんにちわ。
うちのサイトもMT4.21へアップグレードして、こちらのカスタマイズしようと思ったのですが、どうやらうちの環境では動かないようなのです。
smartyの頁分割はうまく動いているので、今もそのまま使わせていただいておりますが、記事が多くなってきた為、smartyを使ったままでサンプル6のような仕様にしたいのです。
今更な感じですけど、出来るものなのでしょうか?
(古いページの方に書こうか迷ったんですけど、場所が違うなら誘導お願いします~)
TAEKO | 2008年9月12日 00:44
>どらさん
こんにちは。
4.2の頁分割が動かないとのことですが、まずは以下のことを確かめてみて下さい。
1).htaccessの編集を済ませてあるかどうか
新規インストールならそのままでいいのですが、バージョンアップの場合は.htaccessの内容が古いままの可能性があるので、ダイナミック分割を使えるように編集します。
詳しくは公式サイトに書いてあります(この頁からリンク張ってます)。
2)<MTEntries limit="5" offset="auto">の設定をし忘れてないか
これは私がよくやるので(^^;。
Smartyの分割リンクをサンプルのような形にすることは出来ると思います。
ただ、それにはSmartyの知識が必要なので、勉強しないと…ですね(汗。
これから勉強を始めていたらいつコードをかけるようになるか分からないので、まずは4.2の分割が動くようにしてみる方が早いかと思います。
どら | 2008年9月12日 10:01
うは~、すみません。
.htaccessの記述で、「$mtview_server_url$」の所を変更せずにそのままコピペしていたので、動かなかったのが原因でした。
僕もこういう事がよくあるので、お恥ずかしい限りです(´・ω・`)
サンプル6の様にも出来ました!
ありがたく使わせて頂きます。ありがとございます!
どら | 2008年9月12日 13:38
何度もすみません。
例えば、1頁で納まる場合は、ページ分割を出さないように出来ないでしょうか?
MTIfを使ってMTPagerBlockで分岐すればいいと思うのですが、「1頁しかありません」と言う事が分かる為にはどうすればいいんでしょう・・・。
どら | 2008年9月12日 13:59
<MTIf name="last" eq="1"><MTElse>
<MTPagerBlock>
//分割部分
</MTPagerBlock>
</MTIf>
でいけました。これで1頁しか無い場合は分割部分が出なくなります。
※間違えて途中で送信しちゃいました。消しておいて下さい~(;´д⊂)
TAEKO | 2008年9月13日 01:04
>どらさん
解決されてよかったです。^^
そうですね、1頁しかない場合は分割表示を出したくこともありますよね。
途中から消えてたコメントはメンテナンスしておきました。
これからもよろしくです~。
Ryo | 2008年11月17日 18:08
ページ分割参考にさせていただきました。
有益な情報をありがとうございます。
1点、サンプル2について、タグがおかしかったので修正された方がよいかと思います。
</TIfPreviousResults>
こうなっていました。"M"が抜けているようです。
TAEKO | 2008年11月17日 22:52
>Ryoさん
こんにちは。参考にしていただけて嬉しいです。
トラバとご指摘ありがとうございます!
「M」みごとに抜けてましたね(^^;。
さっそく修正しておきました。これからもよろしくお願い致します。
shincafe | 2009年12月 1日 22:30
こんばんは。
記事、わかりやすくて非常に参考にさせていただきました。
これからも色々参考にさせていただきます。
よろしくお願いします
TAEKO | 2009年12月 2日 11:40
>shincafeさん
こんにちは。お役立てて嬉しいです。
こちらこそこれからもよろしくお願いします。
mikuso | 2010年1月21日 14:00
こんにちは。
MT5でページ分割をしようと思っているのですが、[2.分割用コード]はどの部分に記述すればよろしいでしょうか?
現在
~
の直下に記述しているのですが
| 1 | とだけ表示されて5件以上記事をかいても、うまく分割されません。
何か原因があるのでしょうか?
教えていただけると助かります。。
mikuso | 2010年1月21日 14:03
すみません。タグが表示できませんでした。
MTEntries limit="5" offset="auto"
~
MTEntries
の直下です。
TAEKO | 2010年1月22日 00:38
>mikusoさん
こんにちは。
すみません、MT5はまだ未検証なので何とも言えないのですが、たぶんMT4同様に動くと思いますので、分割用コードの位置はそこで問題ないと思います。
まず以下のことをご確認下さい。
ダイナミック・パブリッシングになっているか?
アップグレードの場合、.htaccessの編集を済ませてあるか?
上記が問題ないなら、同じコードでMT4なら動くかどうか、他のブログではどうかなど色々試して現象が起きる条件を絞り込んでみて下さい。よろしくです。
mikuso | 2010年1月22日 18:16
>TAEKOさん
コメントご丁寧にありがとうございます。
ダイナミック・パブリッシングの確認
.htaccessの中身を確認
を行いましたが社内のサーバーの関係でうまく動かなかったようです。
結局静的ファイルを分割するプラグインを使用して対応しました。
個人的なMTでリベンジしたいと思います。
どうもありがとうございました!
TAEKO | 2010年1月23日 00:14
>mikusoさん
なるほど、会社のサーバーの関係だったのですね。
個人ブログを作られたらその時には是非トライしてみて下さい。^^
OGREjp | 2011年2月20日 23:14
こんにちは。参考にさせて頂きながらダイナミック・パブリッシングのアーカイブを分割しようとしています。が、残念ながらうまくいきませんでした。
カテゴリアーカイブを開くと、分割リストは「1」のみ表示され、2以降は出ていません。
そもそも分割自体が失敗している?「1」は表示されているので、タグ自体は生きているようなのですが。
もし何か思い当たる原因がありましたらご教授いただければ幸いです。
1).htaccess
編集済み。そもそも古かったので、一度リネームし、MTでダイナミック・パブリッシングを再指定して再作成。
ダイナミック自体は正常に行えているようです。
2) MTEntries
offset="auto"、limit="20"に設定。
当方で考えている原因
(1)ナビゲーションの場所が違う
MT3から手を入れてきているテンプレートなのでcontent-navの入れ場所が違う?今の場所はcontentタグの直前。
content内に入れても変化無し。
(2)なにか動いていないスクリプトがある
PHPかなにかで、マトモに動いていない(たとえば件数がマトモにとれていないなど)
ログにはエラーなどは出ていないようですが……
TAEKO | 2011年2月21日 09:31
>OGREjpさん
こんにちは。まずはMTのバージョンはいくつでしょうか?
MT5.0にはダイナミックで頁分割が動かない不具合があったと思います。該当バージョンでしたらバージョンアップしてみて下さい。
(1)について
>contentタグの直前。
contentタグというのはなかったと思いますが…。<div id="content">のことでしょうか?
もしかして頁上部(記事リストの上)に分割を表示しようとされてますか?
公式分割は<MTEntries limit="20" offset="auto">の部分で分割を指示してますので、分割コードは</MTEntries>より下に入れる必要があります。<MTEntries>より上に入れると「1」しか表示されず分割はされません。
*もし頁上部に分割を入れたいのでしたら、smarty版をお使い下さい。
http://wing.w-museum.com/200602091310.html
smartyならどこに分割コードを入れても動きます。
ただし、smarty版でも{{assign var="epp" value=5}}は分割コードより先に書いて下さいね。
(2)について
ダイナミックが動いているのならPHPに問題はないと思います。
私の方で思いついたことを書いてみましたので、ご確認下さい。
OGREjp | 2011年2月22日 00:42
こんばんは、OGREjpです。
>contentタグというのはなかったと思いますが…。のことでしょうか?
失礼しました。content要素のdivタグ、ですね。ご指摘の通りです。
>もしかして頁上部(記事リストの上)に分割を表示しよう>とされてますか?
>公式分割はの部>分で分割を指示してますので、分割コードは>より下に入れる必要があります。>より上に入れると「1」しか表示されず分>割はされません。
えええっ!?と思って見直すと、確かにその通りに……。content-nav要素のDIVセクションを置き換える、と公式にあったので素直にそうしていたのですが、いかんせん古くからメンテしていたテンプレートで、要素がいつの間にかEntirisの外に出ていました。
というわけで無事解決できました!ありがとうございます!
さらに、「上部に表示したい」というご指摘もその通りなのです。なので、smarty版を使用することにしました。早速記事を参考にさせていただいています。
(smarty版ならできるはず、とは思っていたのですが、公式版でやってみてから、と思っていました。)
TAEKO | 2011年2月22日 23:26
>OGREjpさん
解決できてよかったです。^^
smarty版なら上部にも表示できますから、用途に応じて使い分けてみて下さいね~。