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タグのスペルミスを修正。

 

トラックバックURL

トラックバックされる際にはこの記事へのリンクをお願い致します

トラックバックの一覧

トラックバック ダイナミック・パブリッシングでのページ分割  »» 2008年9月12日 14:56
 ダイナミック・パブリッシングでのページ分割がMT4.2より搭載されたので、公...
トラックバック 今更ですがカテゴリ別アーカイブにページ分割機能追加  »» 2008年10月29日 10:50
ダイナミックパブリッシングでページ分割をするときに「キャッシュ」のために発生していた不具合を解決。これによりようやくページ分割が導入できた。
トラックバック 過去記事ページ分割実施  »» 2008年11月17日 18:03
過去記事数が7,000を超えたので、こちらのサイトを参考にアーカイブのページ分割をしました。生成には多少時間がかかります...

コメント

サンプル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」みごとに抜けてましたね(^^;。

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

コメントを投稿

 


 <注意>
 ご利用のブラウザ、設定ではコメントのプレビューおよび投稿はご利用になれません。
 コメント投稿の際はお手数ですがjavascriptをオンにして下さい。
 *javascriptオフのまま投稿ボタンを押すと送信内容が消えますのでご注意下さい。