「WordPressで学ぶPHP(4)通信編」を発売しました。
本書は、「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造編」「WordPressで学ぶPHP(3)関数編」の続編にあたり、Webブラウザとサーバー(PHP)との通信と、PHPから他のサーバーに通信することについて解説します。
カテゴリ毎にブログ記事の出力方法を変える
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」では、変数や条件判断について、かなり詳しく解説しています。
「変数や条件判断がよく分からない」という方は、ぜひ拙著をお読みください。