エントリー本文
Movable Type 4 の再構築で「Can't call method "id" on unblessed reference」が発生する問題について
Category:[トラブルシューティング]
Tag:[MovableType, MTEntriesWithSubCategories, MTTopLevelCategories, TroubleShooting]
Movable Type 4 の月別カテゴリーアーカイブの再構築時に、次のようなエラーが発生する場合があります。

これは、「『新着エントリーの New マークを親カテゴリーに表示する』で再構築エラーになります」というご質問を頂いたのが発端です。
以下、本エントリーにて解消方法を展開します。なおこの問題は、バージョン 4.23 で確認しています。
1.問題
切り分けを行なったところ、月別カテゴリーアーカイブが再構築エラーになるのは、MTTopLevelCategories タグと MTEntriesWithSubCategories タグを次のように組み合わせた場合のようです。
<MTTopLevelCategories>
<MTEntriesWithSubCategories>
</MTEntriesWithSubCategories>
</MTTopLevelCategories>
MTSubCatsRecurse タグの有無は関係ありません。
2.解決策
とりあえず、MTEntriesWithSubCategories タグの振る舞いに問題がありそうなので、MTEntriesWithSubCategories タグの代わりに、MTEntries タグを使い、さらに category モディファイアとinclude_subcategories モディファイアを組み合わせます。
「新着エントリーの New マークを親カテゴリーに表示する」のサブテンプレートを例に、修正内容を示します。
変更前
<div class="side">
<div id="categories">
<MTTopLevelCategories>
<MTSubCatIsFirst><MTHasParentCategory><div id="subcategories<MTParentCategory><$MTCategoryID$></MTParentCategory>list"></MTHasParentCategory><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>] <span class="new"><MTEntriesWithSubCategories lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntriesWithSubCategories></span><MTHasSubCategories></div></MTHasSubCategories>
<MTElse>
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><MTCategoryLabel> <span class="new"><MTEntriesWithSubCategories lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntriesWithSubCategories></span>
<MTHasSubCategories></div></MTHasSubCategories>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul><MTHasParentCategory></div></MTHasParentCategory></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</div>
変更後
<div class="side">
<div id="categories">
<MTTopLevelCategories>
<MTSubCatIsFirst><MTHasParentCategory><div id="subcategories<MTParentCategory><$MTCategoryID$></MTParentCategory>list"></MTHasParentCategory><ul></MTSubCatIsFirst>
<MTIfNonZero tag="MTCategoryCount">
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a> [<$MTCategoryCount$>] <span class="new"><MTCategoryLabel setvar="cat"><MTEntries category="$cat" include_subcategories="1" lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntries></span><MTHasSubCategories></div></MTHasSubCategories>
<MTElse>
<li><MTHasSubCategories><div class="subcategories" id="subcategories<$MTCategoryID$>name"></MTHasSubCategories><MTCategoryLabel> <span class="new"><MTCategoryLabel setvar="cat"><MTEntries category="$cat" include_subcategories="1" lastn="1"><$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$></MTEntries></span>
<MTHasSubCategories></div></MTHasSubCategories>
</MTElse>
</MTIfNonZero>
<MTSubCatsRecurse>
</li>
<MTSubCatIsLast></ul><MTHasParentCategory></div></MTHasParentCategory></MTSubCatIsLast>
</MTTopLevelCategories>
</div>
</div>
ピンポイントで抜き出すと以下のようになります。
変更前
<MTEntriesWithSubCategories lastn="1">
<$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$>
</MTEntriesWithSubCategories>
変更後
<MTCategoryLabel setvar="cat">
<MTEntries category="$cat" include_subcategories="1" lastn="1">
<$MTEntryDate format="%Y:%m:%d:%H:%M:%S"$>
</MTEntries>
変更後のサブテンプレートですが、まず、MTCategoryLabel タグに setvar モディファイアを与えて、変数 cat に処理中のカテゴリー名を設定します。
その後、MTEntries タグの category モディファイアに変数 cat を与えることで、処理中のカテゴリだけを対象にします。
さらに include_subcategories モディファイアに 1 を与えることで、category モディファイアで指定したカテゴリー配下のサブカテゴリーも処理対象にします。
- CSSでブログに影をつける(ドロップシャドウ:Movable Type 4.x 配布テンプレート版)
- CORESERVER / XREA にcron ジョブ(Movable Type 4 の run-periodic-tasks)を設定する
- RebuildIndexFilter プラグイン v0.06
- RecommendedEntry プラグイン
- Movable Type プラグイン一覧(MT4対応)
- Movable Type 4.x 本格的CMSサイトを構築するためのMTスーパーテクニック クリエイターが身につけておくべき新・100の法則。
- PowerEdit プラグイン
- チャレンジ! Movable TypeをCMSとして使ってみよう!(第4回 テンプレートモジュールを読み込ませる/head要素の中身を作る)
- Movable Type プラグイン一覧
- Movable Type 4.2 テンプレートセット(コミュニティブログ対応版)修正
