Smart Custom Fields やCustom Fields Templateで特定の要素だけ追加したい

プラグイン
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});
}

これで確認出来る。