include_subcategoriesに関するMovableTypeの謎な仕様と対策
- Customize
- 2009.02.06 18:30
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られそうです。
また、この方法もやっぱり見せかけなので、カテゴリー月別アーカイブまでは対応できません。
やっぱり後者しかないですかねー。他のお仕事しながらまた考えます。
Twitterで記事を紹介して下さい(-人-) 
Comment
トラバありがとうございます。
ダミー記事の方法ですと、日付(週、月、年)アーカイブがダミー記事の該当期しか生成されない事にも気付き、やはり最上位カテゴリまで全て記事に指定する形で対応しています。
カテゴリが3階層以上になるような、ある程度の規模のサイトの場合には、本格的なCMSがいいかも知れませんね。
Comment
こんにちはharryさん。
参考にさせていただきました。
こちらこそありがとうございます!:D
最近は三階層以上のカテゴリーを持ったサイトを作ることは少なくて、できるものだと思い込んでいました…
(MTなら、上層でブログ自体を分けてしまった方がいいですから)
MovableTypeは静的に生成することを前提に作られているので、HTMLの面ではきれいなコーディングができるんですが、複雑なアーカイブのリストアップは苦手です。
歴史が古くて使っている人が多い分、コアファイルの改善も難しいのだろうと思います。
ここまで求めるなら、やっぱりオリジナルCMSが最強なんでしょうね^^;