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文で、以下のようなエラー文が出てしまう為です。
どうやら配列が空だった場合や、型が配列でなかった時に出てしまうエラーだそうです。(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」はとても便利なプラグインですね。
完全に個人的メモになりましたが「ぺとら阿呆やな、こういう書き方で出るで」って言う方は、是非教えて下さい。
それではまた、次回お会いしましょう! アデュー!!
- 著者.
- WEBデザイナー ぺとら
- 役職.
- WEBデザイナー
トランシルバニア星雲・トランスセクシャル星出身。 地球に舞い降りた銀河系WEBデザイナー(2023年現在 WEBデザイナー歴15年)で、主にWordPressのカスタマイズや機能の提案、レタッチ・写真加工が得意。現在は母星でテレワーク中。