「WordPressで学ぶPHP(4)通信編」を発売しました。
本書は、「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造編」「WordPressで学ぶPHP(3)関数編」の続編にあたり、Webブラウザとサーバー(PHP)との通信と、PHPから他のサーバーに通信することについて解説します。
オブジェクトをグループ分けして出力する
MTQに、「ユーザーをグループに分けて出力したい」といった内容の質問がありました。
この質問に答えます。
1.カスタムフィールドでグループを表す
まず、オブジェクトにグループ分けのためのカスタムフィールドを追加します。
カスタムフィールドはドロップダウン型にして、グループ名をその選択肢にします。
ご質問の例だと、ユーザーをグループに分けたいとのことでした。
この場合だと、ユーザーのオブジェクトに、グループを表すドロップダウン型のカスタムフィールドを追加し、「オプション」の欄に個々のグループ名をカンマ区切りで並べます。
そして、個々のユーザーで、そのカスタムフィールドの値(グループ名)を指定します。
2.グループ名ごとに配列に分ける
次に、テンプレートを組んで、グループごとにオブジェクトを出力できるようにします。
グループ分けしたいオブジェクトをすべて読み込み、グループ名と同名の配列に、出力したい情報を追加していきます。
たとえば、以下のように、ユーザーが5人いて、赤/青/黄の3つのグループに分かれているとします。
ユーザー名 | グループ名 |
---|---|
山田 | 赤 |
鈴木 | 青 |
高橋 | 赤 |
斎藤 | 黄 |
田中 | 青 |
この場合、「赤」という名前の配列は、以下のように作ります。
インデックス | 内容 |
---|---|
0 | 山田さんの情報を出力するHTML等 |
1 | 高橋さんの情報を出力するHTML等 |
同様に、「青」の配列と、「黄」の配列は、それぞれ以下のようになります。
「青」の配列
インデックス | 内容 |
---|---|
0 | 鈴木さんの情報を出力するHTML等 |
1 | 田中さんの情報を出力するHTML等 |
「黄」の配列
インデックス | 内容 |
---|---|
0 | 斎藤さんの情報を出力するHTML等 |
また、後で各グループの情報を出力するために、グループ名の情報も必要です。
そこで、グループ名をハッシュに保存します。
ハッシュのキーをグループの名前とし、値を1にします。
こうしておけば、ハッシュのキーを順に取り出すことで、グループ名を得ることができます。
3.情報を出力する
最後に、2.の手順で作った配列とハッシュを元に、各グループの情報を出力します。
グループ名の情報をgroupsというハッシュに保存したとすれば、以下のようなテンプレートで出力できます。
<mt:Loop name="groups"> グループ名(変数__key__の値)等を出力 <mt:Loop name="$__key__"> グループの各オブジェクトの情報(変数__value__の値)等を出力 </mt:Loop> </mt:Loop>
外側のMTLoopタグで、ハッシュgroupsの要素を1つずつ取り出しながら繰り返します。
ハッシュのキーをグループ名にしたので、変数__key__の値がグループ名になります。
次に、内側のMTLoopタグで、各グループの配列から、オブジェクトの情報を順に出力します。
配列の名前をグループ名(=ハッシュのキー=変数__key__の値)にしたので、MTLoopタグのnameモディファイアを「$__key__」にしています。
4.事例
質問の事例だと、以下のようにテンプレートを組むと良いでしょう。
<mt:Authors need_entry="0"> <$mt:AuthorGroup setvar="group"$> <$mt:SetVar name="groups" key="$group" value="1"$> <mt:If name="group"> <mt:SetVarBlock name="$group" function="push"> <p><$mt:AuthorLastname$> <$mt:AuthorFirstname$> <img src="<$MTAuthorUserpicURL$>" width="100" height="100" alt="" /></p> </mt:SetVarBlock> </mt:If> </mt:Authors> <mt:Loop name="groups"> <h1><$mt:GetVar name="__key__"$></h1> <mt:Loop name="$__key__"> <$mt:GetVar name="__value__"$> </mt:Loop> </mt:Loop>
4-1.前半
前半(10行目まで)は、MTAuthosタグのブロックでユーザーを読み込んで、グループ名のハッシュと、各グループの配列を作る処理です。
グループ名のカスタムフィールドでは、テンプレートタグ名を「MTAuthorGroup」にしているものとします。
2行目で、グループ名(MTAuthorGroupタグ)を変数groupに代入します。
3行目で、ハッシュgroupsに、キーが変数groupの値(=グループ名)で、値が1の要素を作ります。
5~8行目では、グループ名(変数groupの値)と同じ名前の配列に、ユーザーの情報を追加します。
ただし、ユーザーによってはグループに割り当てられていない(=変数groupに値がない)こともあり得ますので、4行目のMTIfタグで、グループに割り当てられているユーザーだけ、5~8行目を処理します。
4-2.後半
後半(11行目以降)は、ハッシュと配列から、各グループの情報を出力する処理です。
11行目のMTLoopタグで、ハッシュgroupsの要素を順に取り出しながら繰り返します。
12行目で、変数__key__(=グループ名)を出力します。
13行目のMTLoopタグで、名前が変数__key__の値になっている配列(=各グループの配列)から、要素(=ユーザーの情報を出力するHTML等)を順に取り出しながら繰り返します。
そして、14行目で、各ユーザーの情報を出力します。
5.配列やハッシュは必須
この例のように、手の込んだ処理をしようとすると、配列やハッシュを避けて通ることができません。
拙著「Movable Type 5.1 Webサイト製作ガイドVolume 2」では、配列やハッシュについて、かなり詳しく解説しています。
「配列やハッシュがよく分からない」という方は、ぜひ拙著をお読みください。