top

ダイナミック・パブリッシングで頁分割(3) archives.html編

archives.htmlというのがあります。公開されている全エントリーを表示するファイルで標準で用意されています。WingMemoでは月別アーカイブを使っていないので(月別頁を使っているのはメインサイトのブログ)、archives.htmlをそのまま過去ログ置き場にしています。が、これって全エントリーを出してるものだから、記事がたまってくると延々と下に伸びていくばかりなんですよね。頁が長くなってくるとスクロールもだんだん面倒になってきます。で、適当に区切って分割してみることにしました。

分割するにはダイナミックページにしないといけないので、まずはプラグインを使っているサイドバー部分を静的別パーツ化して下準備。

■基本の分割方法
archives.htmlをデフォ状態で分割するのは簡単です。アーカイブリストの部分を以下のように書き換えて(赤字の数字の部分が1頁に表示させたい件数)、

<ul class="archive-list">
{{assign var="epp" value=20}}
<MTArchiveList lastn="20" offset="`$smarty.request.offset`">
<li class="archive-list-item"><a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a></li>
</MTArchiveList>
</ul>

こちらの分割ソースの<$MTArchiveCount$><$MTBlogEntryCount$>に変えるだけです。


しかし、ここのアーカイブ頁はただダラダラと全エントリーを表示するのではなく、月毎に区切って記事を表示しています。その方が見やすくて分かりやすいし、この状態を保ったまま分割したい。そのためには記事単位ではなくて、月単位で分割する必要があります。月単位で分割するには投稿のある月の総数が必要になります。しかし全記事数は<$MTBlogEntryCount$>で取得できても、投稿のある月の総数なんてどうやって取得したらいいのか?

その月のエントリー数を取得するタグ(<$MTArchiveCount$>)はあっても、さすがにこればっかりは無い...。都合よくプラグインとかないかな~と探していたら、ありました!

PerlScript Plugin

テンプレートの中に Perl のコードを直書きできるプラグインだそうで、これを利用すると投稿のある月の総数も取得できるんだそうです。月の総数は使い方の一例にしか過ぎないので、かなり応用と拡張性の高いプラグインだと思われます。これを使って「月単位での頁送り」をやってみます。

■月単位での分割方法

1.プラグインのセット
まずはここから「mtperlscript-1_4.zip」をダウンロードして解凍。「perlscript.pm」と「perlscript.pl」の2つのファイルが出てくるので、それぞれを指定されたディレクトリにアップしてやります。
・perlscript.plは「plugins」ディレクトリ内にアップ
・perlscript.pmは「extlib」下に新しく「bradchoate」ディレクトリを作成してそこにアップ

2.投稿のある月の総数取得用のファイル作成
ダイナミック下ではPerlのプラグインは使えないので、月数取得用の静的ファイルを分けて作ります。インデックステンプレートで新しいテンプレートを作成し、以下の内容を記入してmonthly_count.htmlというファイル名で保存・再構築。

<MTSetVar name="list_count" value="0">

<MTArchiveList archive_type="Monthly">
<MTPerlScript>
$ctx->{__stash}{vars}{list_count}++;
</MTPerlScript>
</MTArchiveList>

<$MTGetVar name="list_count"$>

これで月の数字だけが出力されるファイルが出来上がります。nlog(n)様、ありがとうございました。

3.アーカイブ頁の分割
アーカイブリストの部分を以下のように変更。

{{assign var="epp" value=6}}
<MTArchiveList archive_type="Monthly" lastn="6" offset="`$smarty.request.offset`">
<b><$MTArchiveTitle$></b> (<$MTArchiveCount$>)
<div class="all-list">
<MTEntries>
<a href="<$MTEntryPermalink valid_html="1"$>">
<$MTEntryTitle$></a><br />
</MTEntries>
</div>
</MTArchiveList>

赤字の数字の部分で1頁に表示したい月の数を決めます(2か所とも同じ数字にして下さい)。6だと6ヶ月毎(半年毎)に頁送りされるようになります。12にすると1年単位で頁送りできますね。その辺は記事数の溜まり具合に合わせて。

そして分割を表示させたい箇所に以下の分割コードを挿入。

<!-- 頁分割ここから -->
{{capture assign="count"}}<$MTInclude file="monthly_count.html"$>{{/capture}}
{{if $count > $epp}}
{{if $smarty.request.offset > 0}}
<a href="?offset={{$smarty.request.offset-$epp}}">&lt;</a>
{{/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>
{{/if}}

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

赤字の部分で先ほど作ったファイルから投稿のあった月の総数を読み込んでいます。この例では前後頁へのリンク(矢印部分)はリンクが存在するときだけ出てくるようにしています。

<2007.2.10 追記>
ダイナミック頁だけで全て対応できる方法がみつかったので、現在は以下に移行しています。
ダイナミック・パブリッシングで頁分割(6) archives.html編(改)
<2007.8.2 4.0に対応>
対応箇所・理由はこちらを参照

 

コメント

 初めまして。MT3.33-jaにてダイナミックパブリッシング化をいたしました。そしてこちらのサイトを参考に(丸写しで)ページの分割もすんなりできました。有益な情報ありがとうございます。
 更にこの記事にあるようにarchives.htmlの分割も試みました。一見上手く行った様なのですが、吐き出されたページを見てみると、全部じゃないのですが、一部エントリータイトルがダブって表示されてしまいます。分割の1ページ目は大丈夫なのですが、2ページ以降にそれが現れるようです。
 不躾ながら、その様な事例ならびに対処法などご存知ならば、お教え頂けないかとコメントさせて頂きました。勝手なお願いで申し訳ございませんが、もしご存知で、かつお暇がございましたらご教授願えますでしょうか。

初めまして。何かお役に立てることがあったなら嬉しいです。

archives.html拝見しましたが、私もこのような現象は初めてです。私の動かしているブログでは3つとも(全部ダイナミックです)こんなことになったことはないですし…。不思議ですね…どうしてこうなるんだろう…。
ダイナミックのみの現象ですか? スタティックでは正常ですか? ダイナミックのみで出る場合、分割無しとありで違いますか? 1つ1つ条件を絞り込んで検証していったら何か手がかりみたいなものが見つかるかもしれません。

この件に関係あるかどうかは分かりませんが、キャッシュは頁分割と相性がよくなかったという話は聞いたことがあります。共通部分は静的別パーツにしてMTIncludeし動的頁を軽くする等工夫すれば、キャッシュなしでもいけるのではと思います。
それとmtdb_base.phpの修正はお済みですか? 3.32と3.33にはダイナミックでアーカイブ頁の前後リンクがおかしくなるバグがありますので、もしまだでしたら以下の頁へどうぞ。
http://wing.w-museum.com/200608301558.html

ファイル名はデフォルトのままにされているようですが、それが原因てこともないでしょうしねえ…(ここはアーカイブマッピングでデフォルトの命名は使わないようにしているので)。すみません、これ以上は分からないです。なんとか原因が分かってダイナミックで運営できるといいですね。

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

そうですか、事例は無いですか。自分なりにもう少し検討してみますが、一応、月別表示をしなければ大丈夫なようです。つまりご紹介のプラグインを使わなければ。それとmtdb_base.phpの修正もTAEKOさんのサイトを参考に施しました。キャッシュによる最適化はぼくの環境(さくらレンタルサーバー)では、どうも機能しないようなので行っていません。

一度ダイナミックパブリッシングを経験すると、もう戻したくなくなりますね。気長に解決策を探して行きたいと思います。有用な情報が満載なので、これからも利用させて頂きます。お時間を取らせ申し訳ございませんでした。ありがとうございます。

失礼しました、修正の方はお済みでしたね。

archives.htmlはプラグイン無しなら問題ないのなら、怪しいのはその辺りでしょうか。コピペミスはなかったか、monthly_count.htmlは静的生成になっていたか、思いつくのはそれぐらいですが…。案外小さなことが原因だったりするので、ひょっと解決するかもしれません。その時はまた試してみて下さいね。

ダイナミック、いいですよ~。再構築もテンプレ修正も気軽に出来て即座に反映されるし。すっかりこの環境に慣れてしまったので、もう静的生成には戻れない気分です。これからもよろしくお願い致します。

こんにちは。その後紆余曲折ありまして、結局、ダイナミック指定をしているアーカイブページの MTEntryTitleで出力される物に一部ダブりが見られることが判りました。

そしてそれが特定のエントリーだと言うことも判明し、結局、一端そのエントリーを削除し、再度バックアップから読込むという方法で一応解決しました。でもMovableTypeの管理画面のエントリーの一覧では勿論ダブっていないですし、静的生成に戻したらダブりは見られません。

そんなわけで『??』な感じですが、まあ直ったから良いかと思っています。お騒がせ致しましたので、ご報告を兼ねてコメントさせて頂きました。今後も色々と参考にさせて頂きます。ありがとうございました。

解決されたようで何よりです。
インポートで読み込むとエントリーIDが(場合によってはベースネームも)変わるので、もしかしてその辺に何かが? 関係あるかどうか分かりませんが、ダイナミックの場合、複数ブログを運営しているとブログIDが正しく認識されないことがあるので、ID関係でまだ何かバグが残ってるのかもしれませんね(ちなみにこのバグはリンク先をhttpから指定することで防げます)。

スタティックに比べるとまだじゃじゃ馬なところがあるダイナミックですが、手綱さばき次第で乗りこなせるところもあるので、それを楽しみながら動かしてます(笑)。