top

ダイナミック・パブリッシングで頁分割(8) MT4.2公式編

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">&laquo; 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 &raquo;</a>
</MTIfMoreResults>

●サンプル2 « 前へ | 次へ »
前後リンクだけを出したもの。好みで「前の○件」などにするのもいいかと。

<MTIfPreviousResults>
<a href="<MTPreviousLink>" rel="prev">&laquo;  前へ</a>&nbsp;&nbsp;
</MTIfPreviousResults>
|
<MTIfMoreResults>
&nbsp;&nbsp;<a href="<MTNextLink>" rel="next">次へ  &raquo;</a>
</MTIfMoreResults>

●サンプル3 «  1 / 20  »
「今の頁/全頁」というパターン。他のバリエーションと組み合わせるなど工夫もいろいろ出来ます。

<MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">
&laquo;</a>&nbsp;&nbsp;</MTIfPreviousResults>
 
<MTPagerBlock>
<MTIfCurrentPage><MTVar name="__value__"></MTIfCurrentPage>
<MTIf name="__last__"> / <MTVar name="__value__"></MTIf>
</MTPagerBlock>
 
<MTIfMoreResults>&nbsp;&nbsp;<a href="<MTNextLink>" rel="next">
&raquo;</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">&laquo; 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 &raquo;</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">&laquo; Previous</a>&nbsp;</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>&nbsp;
</MTIf></MTIf>
</MTPagerBlock>
 
<MTIfMoreResults><a href="<MTNextLink>" rel="next"> Next &raquo;</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">&laquo; Previous</a> &nbsp;</MTIfPreviousResults>
 
<MTPagerBlock>
<MTIf name="to" gt="9">
<MTIf name"__first__"><a href="<MTPagerLink>"><MTVar name="__value__"></a> ... &nbsp;</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>&nbsp;
</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"> &nbsp;Next &raquo;</a>
</MTIfMoreResults>

サンプルでは数字と数字の間はスペースで調整しているのが多いですが、お好みでcss装飾に変えても。

<2008.8.23>コードの重複ミスを修正。
<2008.11.17>サンプル2のMTタグのスペルミスを修正。

 

トラックバックの一覧

トラックバック ダイナミック・パブリッシングでのページ分割  »» 2008年9月12日 14:56
 ダイナミック・パブリッシングでのページ分割がMT4.2より搭載されたので、公...
トラックバック 今更ですがカテゴリ別アーカイブにページ分割機能追加  »» 2008年10月29日 10:50
ダイナミックパブリッシングでページ分割をするときに「キャッシュ」のために発生していた不具合を解決。これによりようやくページ分割が導入できた。
トラックバック 過去記事ページ分割実施  »» 2008年11月17日 18:03
過去記事数が7,000を超えたので、こちらのサイトを参考にアーカイブのページ分割をしました。生成には多少時間がかかります...
トラックバック Movable Type 4.2 にバージョンアップ  »» 2009年4月10日 21:27
Movable Type 4.2 がリリースされていることはわかっていたのだけど...
トラックバック トップページをページ分割  »» 2009年8月22日 22:35
昨日仕事から帰り、節々の痛む死んだ体でなんとか作業したのですでにお気づきの方もい...
トラックバック カテゴリアーカイブを動的に生成するようにしました  »» 2009年9月21日 10:26
この新しいブログは200エントリにも満たないのにどういうわけかエントリの新規投稿時にもエラーになってしまうようになってきたので,日別,月別,カテゴリ,月別...
トラックバック アーカイブページのページ分割  »» 2009年12月 1日 22:27
アーカイブページをページ分割しました。 そろそろ10件を超えるカテゴリがでてきま...
トラックバック アーカイブを分割しました  »» 2011年2月25日 01:01
あれほど!悩ましかった、ダイナミック・パブリッシングでのページ分割。公式の方法で...

コメント

サンプル1の最後の二行ダブっているようです。何も考えず貼り付けたらエラーが出たので最初渋りましたw。ご確認いただけましたらこのコメントは削除して頂いてかまいません。でわでわ

こんにちは。
うわあ!ダブってますね(汗)。後で修正しておきます。
ありがとうございました!

こんにちわ。
うちのサイトもMT4.21へアップグレードして、こちらのカスタマイズしようと思ったのですが、どうやらうちの環境では動かないようなのです。
smartyの頁分割はうまく動いているので、今もそのまま使わせていただいておりますが、記事が多くなってきた為、smartyを使ったままでサンプル6のような仕様にしたいのです。
今更な感じですけど、出来るものなのでしょうか?
(古いページの方に書こうか迷ったんですけど、場所が違うなら誘導お願いします~)

>どらさん
こんにちは。
4.2の頁分割が動かないとのことですが、まずは以下のことを確かめてみて下さい。

1).htaccessの編集を済ませてあるかどうか
新規インストールならそのままでいいのですが、バージョンアップの場合は.htaccessの内容が古いままの可能性があるので、ダイナミック分割を使えるように編集します。
詳しくは公式サイトに書いてあります(この頁からリンク張ってます)。
2)<MTEntries limit="5" offset="auto">の設定をし忘れてないか
これは私がよくやるので(^^;。

Smartyの分割リンクをサンプルのような形にすることは出来ると思います。
ただ、それにはSmartyの知識が必要なので、勉強しないと…ですね(汗。
これから勉強を始めていたらいつコードをかけるようになるか分からないので、まずは4.2の分割が動くようにしてみる方が早いかと思います。

うは~、すみません。
.htaccessの記述で、「$mtview_server_url$」の所を変更せずにそのままコピペしていたので、動かなかったのが原因でした。
僕もこういう事がよくあるので、お恥ずかしい限りです(´・ω・`)
サンプル6の様にも出来ました!
ありがたく使わせて頂きます。ありがとございます!

何度もすみません。
例えば、1頁で納まる場合は、ページ分割を出さないように出来ないでしょうか?
MTIfを使ってMTPagerBlockで分岐すればいいと思うのですが、「1頁しかありません」と言う事が分かる為にはどうすればいいんでしょう・・・。

<MTIf name="last" eq="1"><MTElse>
<MTPagerBlock>
//分割部分
</MTPagerBlock>
</MTIf>

でいけました。これで1頁しか無い場合は分割部分が出なくなります。

※間違えて途中で送信しちゃいました。消しておいて下さい~(;´д⊂)

>どらさん
解決されてよかったです。^^
そうですね、1頁しかない場合は分割表示を出したくこともありますよね。

途中から消えてたコメントはメンテナンスしておきました。
これからもよろしくです~。

ページ分割参考にさせていただきました。
有益な情報をありがとうございます。

1点、サンプル2について、タグがおかしかったので修正された方がよいかと思います。

</TIfPreviousResults>
こうなっていました。"M"が抜けているようです。

>Ryoさん
こんにちは。参考にしていただけて嬉しいです。

トラバとご指摘ありがとうございます!
「M」みごとに抜けてましたね(^^;。

さっそく修正しておきました。これからもよろしくお願い致します。

こんばんは。
記事、わかりやすくて非常に参考にさせていただきました。
これからも色々参考にさせていただきます。
よろしくお願いします

>shincafeさん
こんにちは。お役立てて嬉しいです。
こちらこそこれからもよろしくお願いします。

こんにちは。
MT5でページ分割をしようと思っているのですが、[2.分割用コード]はどの部分に記述すればよろしいでしょうか?
現在

の直下に記述しているのですが
| 1 | とだけ表示されて5件以上記事をかいても、うまく分割されません。

何か原因があるのでしょうか?
教えていただけると助かります。。

すみません。タグが表示できませんでした。
MTEntries limit="5" offset="auto"

MTEntries

の直下です。

>mikusoさん
こんにちは。
すみません、MT5はまだ未検証なので何とも言えないのですが、たぶんMT4同様に動くと思いますので、分割用コードの位置はそこで問題ないと思います。

まず以下のことをご確認下さい。
ダイナミック・パブリッシングになっているか?
アップグレードの場合、.htaccessの編集を済ませてあるか?

上記が問題ないなら、同じコードでMT4なら動くかどうか、他のブログではどうかなど色々試して現象が起きる条件を絞り込んでみて下さい。よろしくです。

>TAEKOさん

コメントご丁寧にありがとうございます。

ダイナミック・パブリッシングの確認
.htaccessの中身を確認

を行いましたが社内のサーバーの関係でうまく動かなかったようです。
結局静的ファイルを分割するプラグインを使用して対応しました。
個人的なMTでリベンジしたいと思います。

どうもありがとうございました!

>mikusoさん
なるほど、会社のサーバーの関係だったのですね。
個人ブログを作られたらその時には是非トライしてみて下さい。^^

こんにちは。参考にさせて頂きながらダイナミック・パブリッシングのアーカイブを分割しようとしています。が、残念ながらうまくいきませんでした。

カテゴリアーカイブを開くと、分割リストは「1」のみ表示され、2以降は出ていません。
そもそも分割自体が失敗している?「1」は表示されているので、タグ自体は生きているようなのですが。

もし何か思い当たる原因がありましたらご教授いただければ幸いです。

1).htaccess
編集済み。そもそも古かったので、一度リネームし、MTでダイナミック・パブリッシングを再指定して再作成。
ダイナミック自体は正常に行えているようです。

2) MTEntries
offset="auto"、limit="20"に設定。

当方で考えている原因
(1)ナビゲーションの場所が違う
MT3から手を入れてきているテンプレートなのでcontent-navの入れ場所が違う?今の場所はcontentタグの直前。
content内に入れても変化無し。

(2)なにか動いていないスクリプトがある
PHPかなにかで、マトモに動いていない(たとえば件数がマトモにとれていないなど)
ログにはエラーなどは出ていないようですが……

>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です。
>contentタグというのはなかったと思いますが…。のことでしょうか?
失礼しました。content要素のdivタグ、ですね。ご指摘の通りです。


>もしかして頁上部(記事リストの上)に分割を表示しよう>とされてますか?
>公式分割はの部>分で分割を指示してますので、分割コードは>より下に入れる必要があります。>より上に入れると「1」しか表示されず分>割はされません。

えええっ!?と思って見直すと、確かにその通りに……。content-nav要素のDIVセクションを置き換える、と公式にあったので素直にそうしていたのですが、いかんせん古くからメンテしていたテンプレートで、要素がいつの間にかEntirisの外に出ていました。

というわけで無事解決できました!ありがとうございます!

さらに、「上部に表示したい」というご指摘もその通りなのです。なので、smarty版を使用することにしました。早速記事を参考にさせていただいています。
(smarty版ならできるはず、とは思っていたのですが、公式版でやってみてから、と思っていました。)

>OGREjpさん
解決できてよかったです。^^
smarty版なら上部にも表示できますから、用途に応じて使い分けてみて下さいね~。