プラグイン
Smart Custom Fields
Custom Fields Template
を使っていて不便に思ったこと。
グループを作った場合、グループ内の特定の項目だけを増殖させたい。
これが出来ない。
グループ内の特定の項目だけを増殖
入力項目が
ーーーーーーー
種類
料理名
値段
ーーーーーーー
こういうグループを「groups」というグループ名で作る。(グループラベルは「メニュー」とする)
入力内容はこんな感じ。
「メニュー」
ーーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーーー
「追加」をして次は
ーーーーーーー
種類:麺類
料理名:ラーメン
値段;600円
ーーーーーーー
こんな風に入れる。
だけど一つの「種類」に対して複数の「料理名・値段」だけを追加したい場合
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
料理名:天津飯
値段;900円
ーーーーーー
こうしたい場合は出来ない。
解決策
入力側では出来ないみたいなので出力側でがんばってみる。
入力側では
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
ーーーーーー
種類を同じにして複数登録する。
出力側の処理
例えばグループ「groups」の内容が次のようになっている場合
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
ーーーーーー
種類:麺類
料理名:ラーメン
値段;700円
ーーーーーー
種類:麺類
料理名:タンメン
値段;900円
ーーーーーー
種類ごとにグループ分けしてあげる。
///////////////
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
//////////////
種類:麺類
料理名:ラーメン
値段;700円
ーーーーーー
種類:麺類
料理名:タンメン
値段;900円
ーーーーーー
こうなっていればHTMLで出力するときに
ご飯物ボックス
麺類ボックス
が別個に作れる。
スクリプト
$groupsというオブジェクトには
(種類)[service]=>’ご飯もの’
(料理名)[name]=>’チャーハン’
(値段)[price]=>’700円’
これが1要素になった配列が入っている。
ーーーーーー
種類:ご飯もの
料理名:チャーハン
値段;700円
ーーーーーー
種類:ご飯もの
料理名:天津飯
値段;900円
ーーーーーー
種類:麺類
料理名:ラーメン
値段;700円
ーーーーーー
種類:麺類
料理名:タンメン
値段;900円
ーーーーーー
まず1回 foreachで回して(種類)だけを取り出す。
$service = ""; $service_ary = array(); //-----serviceだけ取り出す---------- foreach($groups as $group ){ $service = $group['service']; array_push($service_ary, $service); }
$service_aryの中身
(ご飯もの、ご飯もの、麺類、麺類)
こんな感じになっている。
重複しているものを整理する。
$service_ary = array_unique($service_ary);
(ご飯もの、麺類)になった。
しかしvar_dumpしてみると
array(2) { [0]=> string(3) "CUT" [2]=> string(4) "perm" }
重複していた[1][3]がカットされたのでkeyが連番になっていない。
もう一度foreachで回して入れ替える。
$edit_service_ary = array(); foreach($service_ary as $part ){ array_push($edit_service_ary, $part); }
これで連番になった$edit_service_ary(ご飯もの、麺類)が出来た。
これを使って「ご飯もの、麺類」のグループ分けをする。
////////////グループ分け////////////////////
$edit_service_aryの要素数を取得。 $ary_num = count($edit_service_ary);
要素数の数だけ配列 $a1, $a2, ・・・を用意する。
for($i=0; $i<$ary_num; $i++){ $a{$i} = array(); }
同じ「種類」(service)のセットを $a1などの配列にまとめていく。
foreach($groups as $group ){ $service = $group['service']; for($i=0; $i<$ary_num; $i++){ if($service == $edit_service_ary[$i]){ array_push($a{$i}, $group); } } }
出来たものは
for($i=0; $i<$ary_num; $i++){ var_dump($a{$i}); }
これで確認出来る。