オラオラのoscarさんから「親カテゴリーに子カテゴリーのエントリーも表示させ、かつ頁分割も行いたい」との質問を受け、Perlプラグインを使う部分を静的生成して動的頁に取り込む方法を提案しました。それで上手くいかれたようなのですが、
子カテゴリのエントリーを含むアーカイブ(ダイナミックパブリッシング暫定版)
oscarさんも言われる通り、確かにスマートな方法ではないです。私もそれは気になっていました。しかもこの後、自分のテストブログで動作実験したカテゴリー頁を見ていた時、この方法には問題があることに気が付きました。
子カテゴリーに投稿があっても親カテゴリーの記事数が更新されないんですね。どうもこれはMTの仕様らしく、投稿のないカテゴリーは再構築の対象にならないようなのです。それを回避するためにリビルド用のプラグインまで出ていたようです。
参考記事:小粋空間 親カテゴリーアーカイブにサブカテゴリーのエントリーを表示する
しかもoscarさんによるとこのリビルド用プラグインは3.3では動作しないとか。仮に動作したとしても、せっかくダイナミックなのに静的用のリビルドプラグインを使っていたのではちょっと間抜けすぎな感じです。ここはやっぱりダイナミックで直接子カテゴリーを含む記事数を出すのが根本的な解決方法...。なんとか出来ないのか?
ここで閃きました。あんちもん2.Labから出されていたカウント機能のあるダイナミック対応のAutoIncrementalVarプラグインを使えないだろうか!?
結果は大成功!! みごと、ダイナミックで動的に子カテゴリを含む記事数を出力させて頁分割することが出来ました! 以下、その方法の覚え書きです。
*追記:この記事を書いた後になって、3.3からは<$MTEntriesCount$>というタグが追加されていたことに気が付きました。そのため<$MTEntriesCount$>で記事数取得&分割する方法も併せて追記させていただきました。
*なお、MT4.2からはデフォルトでダイナミック・パブリッシングに頁分割機能が提供されるようになったので、4.2以降ならもっと簡単に子カテゴリも含む記事分割が出来ます。→詳しくはこちらを
1.1頁に表示させる件数の設定
<MTEntries>~</MTEntries>を以下のように<MTEntriesWithSubCategories>~</MTEntriesWithSubCategories>に書き換えます。
●4.0~4.13の場合
{{assign var="epp" value=5}}
<MTEntriesWithSubCategories lastn="5" offset="`$smarty.request.offset`">
...
</MTEntriesWithSubCategories>
●3.36以前の場合
3.3以前のダイナミックには、category="カテゴリ名"を指定しないと<MTEntriesWithSubCategories>が動作しないという不具合がありますので、以下のようにします。
{{assign var="epp" value=5}}
{{capture name="subcat"}}<$MTCategoryLabel$>{{/capture}}
<MTEntriesWithSubCategories lastn="5" offset="`$smarty.request.offset`" category="`$smarty.capture.subcat`">
...
</MTEntriesWithSubCategories>
赤字の数字の部分で1頁に表示する件数を決めます。2か所とも同じ数字にして下さい。
2.分割用コードの書き換え
分割コードは以下の頁から好きなバリエーションを選んで下さい。
ダイナミック・パブリッシングで頁分割(1)
ダイナミック・パブリッシングで頁分割(4) バリエーション編
ここでは冒頭の差し替え部分のみの説明を行います。カテゴリーアーカイブの場合、冒頭の部分は通常は以下のようになります。
{{capture assign="count"}}<$MTCategoryCount$>{{/capture}}
↓ここの赤字の部分を以下のように書き換えます↓
●3.3~4.13の場合
{{capture assign="count"}}<MTEntriesWithSubCategories lastn="0"><MTEntriesHeader><$MTEntriesCount$></MTEntriesHeader></MTEntriesWithSubCategories>{{/capture}}
赤字の部分も含めて一行で一気に続けて下さい。改行しないように。
*3.3~3.36は太字のlastn="0"をcategory="$subcat"に変更して下さい。
以下はお好きな分割コードで続けて下さい。
●3.2以前の場合
3.2以前は<$MTEntriesCount$>が使えないのでAutoIncrementalVar プラグインで記事数を求めます。まず下準備として、AutoIncrementalVar プラグインをダウンロードし、解凍して説明通りにMTにアップします。ダイナミックサイトでも静的用・動的用両方アップしておきましょう。
{{capture assign="count"}}<$MTSetVarAutoIncremental name="entryCount" value="0"$><MTEntriesWithSubCategories category="$subcat"><$MTIncrementVar name="entryCount"></MTEntriesWithSubCategories><$MTGetVarWithoutIncrement name="entryCount"$>{{/capture}}
赤字の部分も含めて一行で一気に続けて下さい。改行しないように。
以下はお好きな分割コードで続けて下さい。
これで親カテゴリーも子カテゴリーの記事を表示し、かつ分割表示できるようになります。ダイナミックで動作させていますので、親カテゴリーに投稿がなくても記事数は常にリアルタイムで反映されます。
<2007.8.2 4.0に対応>対応箇所・理由はこちらを参照
<2008.7.9 追記&修正>
MT標準タグで記事数取得する方法も併せて追記。バージョン別対応に記述不足があったところも修正。
コメント
oscar | 2007年2月 6日 00:23
こんばんわ、TAEKOさん。
そうか、エントリー数分足し算してるんだ。やっと理解できた。
ありがとうございました。
TAEKO | 2007年2月 6日 10:56
ええ、これは「数え上げ機能」でエントリー数を数えさせているんです。
カウンター系プラグインってタグの組み方が複雑で慣れないと頭がこんがらがりそうですが、工夫次第でいろいろなところに応用できそうですね。今回はダイナミック対応のプラグインが本当に頼もしくて嬉しかったです。