MTEntryCategoriesを使用して管理画面の並び順で出力
記事に紐づく全てのカテゴリーを管理画面の並び順で出力する方法を調べました。
結論から言うと、力技での解決になります!
テンプレート
<ul>
<mt:LocalVars>
<mt:Ignore> categoriesに、管理画面の並び:カテゴリ名でハッシュ格納 </mt:Ignore>
<mt:SetVar name="count" value="0000">
<mt:TopLevelCategories>
<mt:SetVarblock name="categories" key="$count"><mt:CategoryLabel trim="1"><mt:SetVar name="count" value="1" op="+"><mt:Var name="count" zero_pad="4" setvar="count"><mt:SubCatsRecurse trim="1"></mt:SetVarblock>
</mt:TopLevelCategories>
<mt:Ignore> linksに、カテゴリ一覧のURL:カテゴリ名でハッシュ格納 </mt:Ignore>
<mt:EntryCategories>
<mt:CategoryArchiveLink setvar="link">
<mt:SetVarblock name="links" key="$link"><mt:CategoryLabel trim="1"></mt:SetVarblock>
</mt:EntryCategories>
<mt:Ignore> categoriesをkey(管理画面の並び)でソートしつつループ開始 </mt:Ignore>
<mt:Loop name="categories" sort_by="key">
<mt:Ignore> categoriesのvalue(カテゴリ名)をcategories_labelに格納しておき </mt:Ignore>
<mt:Var name="__value__" setvar="categories_label">
<mt:Ignore> linksのvalue(カテゴリ名)が、categories_labelと一致したときだけcategoryにハッシュ格納 </mt:Ignore>
<mt:Loop name="links">
<mt:If name="__value__" eq="$categories_label">
<mt:SetVarblock name="category" key="$categories_label"><mt:Var name="__key__"></mt:SetVarblock>
</mt:if>
</mt:Loop>
</mt:Loop>
<mt:Ignore> html出力 </mt:Ignore>
<mt:Loop name="category">
<li><a href="<mt:Var name="__value__">"><mt:Var name="__key__"></a></li>
</mt:Loop>
</mt:LocalVars>
</ul>
今回はPowerCMSで実装したのですが、Movable Typeでも同じように対応できると思います。
経緯
PowerCMSでサイトを構築していた際、
記事に紐づく親カテゴリと、その子カテゴリが離れて出力された場合に
どの親カテゴリに属する子カテゴリなのかが分かりづらいため、管理画面の並び順で表示させたいといった要望がありました。
全てのカテゴリーを管理画面の並び順で出力する場合は、MTTopLevelCategoriesやMTSubCategoriesというタグを使用します。
それぞれにソート用のモディファイアが用意されているので(デフォルトで管理画面順に設定されています)、簡単に対応が可能です。
ただし、記事に紐づく全てのカテゴリーの場合は、
MTEntryCategoriesというタグを使う必要があります。
このタグにはソート用のモディファイアが用意されていないため、任意の並び替えはできず、文字コード順に出力されるようです。
どうしても並び替えたい場合は、ハッシュやループを駆使して対応するしかないとのことでした。。
参考
注意点
公式のFAQにも記載のある通り、ループが多く重い処理です。
(今回はカテゴリ名にリンクを設定する必要があったため、更に処理が増えてしまいました・・・)
カテゴリや記事の数が増えるほど再構築に時間がかかるようになる可能性が高いので、設計の段階で回避するのがベストだと思います!
MTEntryCategoriesでsort_byが使えるようになりますように・・・🙏