Blog

ブログ

include_subcategoriesに関するMovableTypeの謎な仕様と対策

subcategory

MovableTypeをCMS的な構築に利用する場合、左の図のような階層カテゴリー構成にすることがよくあります。

このとき(ビジネスシーンでは少ないですが)上層カテゴリーのページで、下層カテゴリーに書いた記事も含めてリストアップする場合には

<mt:Entries include_subcategories="1"> ~  </mt:Entries>

<mt:EntriesWithSubCategories>  ~  </mt:EntriesWithSubCategories>
を利用します。

しかし、こちらの記事でも書かれているように

ハマッたケース1つ目。Aカテゴリのアーカイブに1件も記事が出てこない。記事一覧の表示方法に、「include_subcategories」という子カテゴリの記事も含む指定があるが、Aに属する記事が1件もない場合、たとえAAに属する記事が存在してもそれすら出てこない。これは全く理解不能。バグではないのか。

ブログ記事へのカテゴリ設定の注意点 – tech.ludicmind.net

上層(図ではCategoryAとCategoryB)に指定された記事がひとつもない場合、下層に記事が100件あろうとも上層カテゴリーには何もリストアップされません。

追記:2009-2-8
categoriesモディファイアのAND指定を利用して上層・下層カテゴリー名を直接明示する方法もありますが、カテゴリーアーカイブでは有効になりません。

これは、バージョン3の頃から連綿と続いている仕様という名の不具合のようで

小粋空間: 親カテゴリーアーカイブにサブカテゴリーのエントリーを表示する

当時はプラグインで対応できましたが、バージョン3.3以降はサポートされていないぽいです。
(なんか他にプラグインあったら誰か教えてください)

そんなわけで対策を考えてみました。まだ作業前なんで検証してませんが…

1.ダミー記事を書く

上層に属するダミー記事を一件書いておき、
mt:Entriesでリストアップするときに、その記事だけid指定で除外。
件の記事で、harryさんが提案されていた方法です。
ただし、そのページでの新着件数よりダミー記事が古くなった場合に表示されるのかという点と、
アーカイブリストが対象外なのが悩ましいところです。

2.PHPを使う

強引ですが…

  1. mt:SubCategoriesなどで「現在より下層の新着記事」を多めにリストアップ
  2. HTMLとして表示せずにPHPの「配列」に入れ込む
    (このとき、ソートできるように日付はUNIX変換する)
  3. PHP側で日付順ソートして出力する

という方法です。もちろんPHP化が前提です。

もうね、アホかとバカかと。
Perlで処理したのにまたPHPかませるのかと。確実に重くなります。
WordPress信者にdisられそうです。

また、この方法もやっぱり見せかけなので、カテゴリー月別アーカイブまでは対応できません。

やっぱり後者しかないですかねー。他のお仕事しながらまた考えます。