MovableTypeをCMS的な構築に利用する場合、左の図のような階層カテゴリー構成にすることがよくあります。
このとき(ビジネスシーンでは少ないですが)上層カテゴリーのページで、下層カテゴリーに書いた記事も含めてリストアップする場合には
<mt:Entries include_subcategories="1"> ~ </mt:Entries>
か
<mt:EntriesWithSubCategories> ~ </mt:EntriesWithSubCategories>
を利用します。
しかし、こちらの記事でも書かれているように
ハマッたケース1つ目。Aカテゴリのアーカイブに1件も記事が出てこない。記事一覧の表示方法に、「include_subcategories」という子カテゴリの記事も含む指定があるが、Aに属する記事が1件もない場合、たとえAAに属する記事が存在してもそれすら出てこない。これは全く理解不能。バグではないのか。
上層(図ではCategoryAとCategoryB)に指定された記事がひとつもない場合、下層に記事が100件あろうとも上層カテゴリーには何もリストアップされません。
追記:2009-2-8
categoriesモディファイアのAND指定を利用して上層・下層カテゴリー名を直接明示する方法もありますが、カテゴリーアーカイブでは有効になりません。
これは、バージョン3の頃から連綿と続いている仕様という名の不具合のようで
小粋空間: 親カテゴリーアーカイブにサブカテゴリーのエントリーを表示する
当時はプラグインで対応できましたが、バージョン3.3以降はサポートされていないぽいです。
(なんか他にプラグインあったら誰か教えてください)
そんなわけで対策を考えてみました。まだ作業前なんで検証してませんが…
1.ダミー記事を書く
上層に属するダミー記事を一件書いておき、
mt:Entriesでリストアップするときに、その記事だけid指定で除外。
件の記事で、harryさんが提案されていた方法です。
ただし、そのページでの新着件数よりダミー記事が古くなった場合に表示されるのかという点と、
アーカイブリストが対象外なのが悩ましいところです。
2.PHPを使う
強引ですが…
- mt:SubCategoriesなどで「現在より下層の新着記事」を多めにリストアップ
- HTMLとして表示せずにPHPの「配列」に入れ込む
(このとき、ソートできるように日付はUNIX変換する) - PHP側で日付順ソートして出力する
という方法です。もちろんPHP化が前提です。
もうね、アホかとバカかと。
Perlで処理したのにまたPHPかませるのかと。確実に重くなります。
WordPress信者にdisられそうです。
また、この方法もやっぱり見せかけなので、カテゴリー月別アーカイブまでは対応できません。
やっぱり後者しかないですかねー。他のお仕事しながらまた考えます。