<MTIfNonZero tag="MTCategoryCount"> の意外な落とし穴

http://hxxk.jp/2004/11/21/1437

記事データ

投稿者

望月真琴

投稿日時

2004-11-21T14:37+09:00

タグ
概要

MTCategoryCount は下書き状態の記事もカウントするので、 <MTIfNonZero> と組み合わせるときは注意が必要です。

リプライ

リプライはまだありません。

記事本文

アーカイブ上で実際に展開される結果

サブカテゴリから親カテゴリへのナビゲーションをするテンプレートにて親カテゴリへのナビゲーションを行う方法を記述しましたが、ひとつだけ注意しておかなければならない点があります。 以前、 Movable Type 3.11 のサブカテゴリ機能についての所感 (3) - 親カテゴリにおける注意点で述べましたが、運用によっては記事を持たない親カテゴリというものが存在する可能性があります。

デフォルトのテンプレートでは、 Main Index にカテゴリが階層化された状態で表示され、記事が存在しないカテゴリについてはリンクを張らないような条件式のテンプレートタグが使われている と述べていますが、その条件式テンプレートタグについて具体的に触れていませんでした。 サブカテゴリから親カテゴリへのナビゲーションをするテンプレート - 上の階層にナビゲーションするリンクにてそのタグを使ったので、解説代わりにメモします。

MTIfNonZero テンプレートタグ

<MTIfNonZero tag="MTCategoryCount">
  <a href="<$MTBlogArchiveURL$><MTCategoryLabel dirify="1">/">Parent category : <MTCategoryLabel dirify="1"></a>
  <MTElse>
  Parent category : <MTCategoryLabel dirify="1">
  </MTElse>
</MTIfNonZero>

これは使用例の一例ですが、条件式にマッチすればリンクアンカーとして、マッチしなければただのテキストとして出力するような記述をしています。 その条件式というものは、テンプレートタグ名を見れば想像が付くと思いますが、「 tag 属性の値が 0 でないならば」というものです。 例えば、メインページのデフォルトテンプレートのカテゴリ部分で見ることができます。 ( 何故かデフォルト・テンプレート - メインページの方には記述されていませんが、実際に Movable Type の管理画面から見ると確認できるはずです。 )

そして、 MTIfNonZero テンプレートタグは 名前に If が含まれているタグ ですので、 MTElse が使えます。 <MTIfNonZero> 〜 </MTIfNonZero> の内側で使うことにより、条件式にマッチしないもの、すなわち「 tag 属性の値が 0 である」という条件を指定することができます。

この使用例の場合は tag 属性の値に MTCategoryCount を指定していますので、「そのカテゴリに記事が 1 つ以上含まれているならば」親カテゴリへのリンクアンカーを付けるようにし、「そのカテゴリに 1 つも記事が含まれていないならば」カテゴリ名をそのまま記述するだけといった結果になります。 こういった性質から、他に tag 属性に指定できる属性として、

などが利用できると思います。 思います、とぼかして書いているのは、マニュアルのテンプレート・タグの中に MTIfNonZero テンプレートタグの記述が見当たらないからです。 デフォルト・テンプレートの方にも書かれてありませんし……。

MTCategoryCount の注意点

MTCategoryCount に限らず、 MTBlogEntryCountMTArchiveCount にも似たようなことが言えるのかもしれませんが、下書き状態の記事も カテゴリーに属するエントリーの数 に含まれます。 ただし、それは <MTSubCategories> 〜 <MTSubCategories> 中でのみ起こるようです。 通常は下書き状態の記事はカウントされません。 それが気になる場合は、 Ogawa::Memoranda: Movable Type 3.11 日本語版・修正案の「 MTSubCategoriesの中でMTCategoryCountを用いると公開状態でないエントリーも数え上げてしまう」を参考にして修正を行うと良いでしょう。

しかし、カテゴリアーカイブの生成条件として、そのカテゴリの直下に公開状態の記事が最低 1 つ存在していなければならないというものがあります。 サブカテゴリの直下に記事を配置し、親カテゴリの直下には記事が全く無いという状態は充分にあり得ます。 その場合、親カテゴリ自身のアーカイブは生成されません。

よって、「公開状態の記事数が 0 」だけれども「下書き状態の記事がある」親カテゴリについては、 サブカテゴリから親カテゴリへのナビゲーションをするテンプレート - 上の階層にナビゲーションするリンクのナビゲーションリストでは、アーカイブが存在しない親カテゴリに対してもリンクを行うことになってしまいますので、注意してください。 もちろん、「公開状態の記事数も下書き状態の記事数も 0 」という場合は MTCategoryCount は 0 ということになりますので、リンクアンカーが付かないテキストとして記述されます。

リプライ

リプライはまだ送られていないか、管理者の承認待ち状態です。

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など