お見積り・ご相談など
お気軽にお問い合わせください

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

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

あなたのやりたい!にお応えします

リースエンタープライズはお客様と寄り添い、
お客様と共に一つの問題解決に取り組みます。
あなたのやりたい、叶えたいを、なんでもお聞かせください。

TEL:06-6940-0662
営業時間/平日 10:00~18:00
WEBデザイナー ぺとら
著者.
WEBデザイナー ぺとら
役職.
WEBデザイナー

トランシルバニア星雲・トランスセクシャル星出身。 地球に舞い降りた銀河系WEBデザイナー(2023年現在 WEBデザイナー歴15年)で、主にWordPressのカスタマイズや機能の提案、レタッチ・写真加工が得意。現在は母星でテレワーク中。