Blog

ブログ

Custom Field Suiteでループの入れ子とループ内の条件分岐

最終更新日:|公開日:

Custom Field Suiteで多階層ループの呼び出し方

Custom Field Suiteで多階層ループの呼び出し方

どうも、ぺとらです。

WordPressのカスタムフィールドを追加するのによく使う「Custom Field Suite」にお世話になっています。
「Custom Field Suite」の素晴らしい所は、ループを利用できると言う所! 「Advanced Custom Field」も便利で使うのですが、こちらの場合は有料アドオンになってしまうのです……。

「Custom Field Suite」の使い方や、基本的な呼び出し方法は他でも分かりやすく紹介されていますが、

今回私がハマったのは「ループの中のループでのループ」です。

分かりにくいかもしれませんが、親子孫に渡る入れ子の場合の出力方法ですね。

紹介されている情報では何故か孫のループは表示されなかったので、色々試した結果ようやく表示されました。

目次

通常のループの場合

通常のループの場合

通常の単独ループの場合は

<?php
  $fields = $cfs->get('loop'); //親ループ
  foreach ($fields as $field) :
?>
<div><?php echo $field['field_name']; ?></div>
<?php endforeach; ?>

で表示されると思います。
get();の中の loop には、管理画面で設定したループの名前を入れて下さい。
echo で呼び出している field_name には、呼び出したい各フィールドの名前が入ります。

ループの中にループがある場合

ループの中にループがある場合

ループの中にループがある場合は

<?php
  $fields = $cfs->get('loop'); //親ループ
  foreach ($fields as $field) :
?>
<div><?php echo $field['field_name']; ?></div>

<?php
  $fields = $field['loop_list']; //子ループ
  foreach ((array)$fields as $field):
?>
<div><?php echo $field['field_name']; ?></div>

<?php endforeach; ?>
<?php endforeach; ?>

で表示されると思います。
get();の中には、管理画面で設定したループの名前を入れて下さい。
(親が loop 、子は loop_list の部分になります)
echo で呼び出している field_name には、呼び出したい各フィールドの名前が入ります。

子ループに(array)が入っているは foreach文で、以下のようなエラー文が出てしまう為です。

Warning: Invalid argument supplied for foreach() ~

どうやら配列が空だった場合や、型が配列でなかった時に出てしまうエラーだそうです。(array)を入れる事で配列が空でも強制的に変換されてエラー回避できるみたいです。
if文でもチェックを入れる事ができる様ですが、(array)を入れたほうが簡単ですね。
本当に助かった……。

こちらを参考にさせて頂きました。
参考記事: PHPのforeach文でnullチェックなしでエラー回避

ループの中のループにループがある場合

ループの中のループにループがある場合

ループの中のループにループがある場合は

<?php
  $fields = $cfs->get('loop'); //親ループ
  foreach ($fields as $field) :
?>
<div><?php echo $field['field_name']; ?></div>

<?php
  $fields = $field['loop_list']; //子ループ
  foreach ((array)$fields as $field):
?>
<div><?php echo $field['field_name']; ?></div>

<?php
  $fields = $field['loop_list_in']; //孫ループ
  foreach ((array)$fields as $field):
?>
<div><?php echo $field['field_name']; ?></div>

<?php endforeach; ?>
<?php endforeach; ?>
<?php endforeach; ?>

で表示されると思います。
単純に foreach 増やしていっただけなんですけどね……。
get();の中には、管理画面で設定したループの名前を入れて下さい。
(親が loop 、子は loop_list 、孫は loop_list_in の部分になります)
echo で呼び出している field_name には、呼び出したい各フィールドの名前が入ります。

更に入れ子が増えた場合はまだ試してませんが、おそらく大丈夫でしょう。
大丈夫じゃなかったら発狂しそうです。

ループの中での条件分岐

おまけでループの中で条件分岐を使う場合の呼び出し方。
カスタムフィールドの値が入ってる時だけ内容を表示させたい。また、チェックボックス等を使ってチェックを入れた場合のみ、内容を表示させたい場合です。

<?php
$check = $field['field_name'];
if($check) :?>
値ある場合の表示
<?php else : ?>
値がない場合の表示
<?php endif; ?>

get_post_meta を使って分岐させても何故か出なかったので、上記の様にするとループ内でも分岐できました。

いかがでしたでしょうか?

ループの入れ子の入れ子が出来る「Custom Field Suite」はとても便利なプラグインですね。
完全に個人的メモになりましたが「ぺとら阿呆やな、こういう書き方で出るで」って言う方は、是非教えて下さい。

それではまた、次回お会いしましょう! アデュー!!

ぺとら
担当者:ぺとら
トランシルバニア星雲・トランスセクシャル星出身。 Manson(マリリン・マンソン)に憧れ、地球に舞い降りた銀河系WEBデザイナーで、「vertical-align: middle;(バーティカルアラインミドル)」という響きが格好良すぎてマークアップエンジニアにもなった。好きな地球人のタイプは、Jeff Goldblum(ジェフ・ゴールドブラム)。