株式会社リースエンタープライズ 大阪南森町発、最強のホームページ制作集団

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」はとても便利なプラグインですね。
完全に個人的メモになりましたが「ぺとら阿呆やな、こういう書き方で出るで」って言う方は、是非教えて下さい。

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

新着記事と笑いは鮮度が命や!

「Custom Field Suiteでループの入れ子とループ内の条件分岐」記事が気に入った方はいいねしよう!!