カテゴリ毎にブログ記事の出力方法を変える

MTQに、「カテゴリ(階層)別テンプレート」という質問があがっていました。
この質問に答えてみます。

1.質問の内容

以下のような構造のカテゴリがあるとします。

├ くだもの
│ ├ あ行
│ └ か行
├ 野菜
│ ├ あ行
│ └ か行
└ お肉
   ├ 豚
  │ ├ あ行
   │ └ か行
   └ 牛
    ├ あ行
     └ か行

この状況で、以下のようにグループを分けて、ブログ記事の出力方法を変えたいということです。

  • 「お肉」→「豚」カテゴリ以下のカテゴリに属するブログ記事
  • 「お肉」→「牛」カテゴリ以下のカテゴリに属するブログ記事
  • 「お肉」→「豚」/「お肉」→「牛」カテゴリ以外で、「あ行」カテゴリに属するブログ記事
  • 「お肉」→「豚」/「お肉」→「牛」カテゴリ以外で、「か行」カテゴリに属するブログ記事

また、質問された方は、以下のようにテンプレートを組んだということです。
ただ、この組み方だと、「お肉」→「牛」→「あ行」カテゴリ以下に属するブログ記事では、「牛カテゴリ以下の内容」と「あ行の内容」の両方の部分が出てしまうという問題があります。

<MTIfArchiveType archive_type="Individual">
  <MTParentCategory>
    <MTIfCategory name="牛">
      牛カテゴリ以下の内容
    </MTIfCategory>
  </MTParentCategory>
</MTIfArchiveType>

<MTIfArchiveType archive_type="Individual">
  <MTParentCategory>
    <MTIfCategory name="豚">
      豚カテゴリ以下の内容
    </MTIfCategory>
  </MTParentCategory>
</MTIfArchiveType>

<MTIfCategory name="あ行">
  あ行の内容
</MTIfCategory>

<MTIfCategory name="か行">
  か行の内容
</MTIfCategory>

2.出力済みであることを変数に保存する

この問題の解決方法はいろいろ考えられますが、元のテンプレートをなるべく崩さないように、以下のように考えることにします。

  • 「牛カテゴリ以下の内容」の部分を出力した場合には、変数を定義して、「出力済み」であることを記憶する
  • 「豚カテゴリ以下の内容」の部分を出力した場合には、変数を定義して、「出力済み」であることを記憶する
  • 「出力済み」の変数が定義されている時には、「あ行」「か行」の部分を出力しない

出力済みであることを、「shown」という変数で表すとします。
この場合、先ほどのテンプレートを以下のように変えます。

<MTIfArchiveType archive_type="Individual">
  <MTParentCategory>
    <MTIfCategory name="牛">
      牛カテゴリ以下の内容
      <$mt:SetVar name="shown" value="1"$>
    </MTIfCategory>
  </MTParentCategory>
</MTIfArchiveType>

<MTIfArchiveType archive_type="Individual">
  <MTParentCategory>
    <MTIfCategory name="豚">
      豚カテゴリ以下の内容
      <$mt:SetVar name="shown" value="1"$>
    </MTIfCategory>
  </MTParentCategory>
</MTIfArchiveType>

<mt:Unless name="shown">
  <MTIfCategory name="あ行">
    あ行の内容
  </MTIfCategory>

  <MTIfCategory name="か行">
    か行の内容
  </MTIfCategory>
</mt:Unless>

以下の各行を追加しています。

5行目

「牛カテゴリ以下の内容」を出力した場合に、変数shownに値1を代入しています。

14行目

「豚カテゴリ以下の内容」を出力した場合に、変数shownに値1を代入しています。

19/27行目

変数shownが定義されていない時だけ、ブロックの内部を出力します。

「牛カテゴリ以下の内容」を出力した場合は、5行目によって変数shownが定義されていますので、ブロックの内部は出力されません。
また、「豚カテゴリ以下の内容」を出力した場合も、14行目によって変数shownが定義されていますので、ブロックの内部は出力されません。

一方、上記以外の場合は変数shownは定義されていませんので、ブロックの内部が出力されます。

3.変数や条件判断は必須

Movable Type 5.1 Webサイト製作ガイドVolume 2この例のように、手の込んだ処理をしようとすると、変数や条件判断を避けて通ることができません。
拙著「Movable Type 5.1 Webサイト製作ガイドVolume 2」では、変数や条件判断について、かなり詳しく解説しています。
「変数や条件判断がよく分からない」という方は、ぜひ拙著をお読みください。