ワードプレスでCFSのサブループ(ループ内ループ)でトラブルが発生しました。
はじめに
ワードプレスのプラグインCustom Field Suiteを使用してカスタムフィールドを取得しているのですが、未入力の情報は取得しないと言う内容がサブループ内でする方法をご紹介いたします。
注意事項
カスタムフィールドの呼び出しに気を付けてください
やりたい事
今回はtableで情報を表示させたいのですが、クライアント様側で入力した内容は表示、未入力の場合は表示させないの2パターンを考えなければいけません。
表示させたい場合
<table> <tr> <th>メニュー名</th> <td>金額</td> </tr> <tr> <td colspan="2">説明分が入ります</td> </tr> </table>
表示させたくない場合
<table> <tr> <th>メニュー名</th> <td>金額</td> </tr> </table>
簡単そうに見えて解決するのに非常に時間がかかりました。
つまずいた内容
Custom Field Suiteの表示と分岐の入力がない場合の分岐にも書かせて頂きましたが、非表示させたい内容の箇所を
<?php if(get_post_meta($post->ID,'カスタムフィールド名',true)): ?> <tr> <td colspan="2"> <?php echo $cfs->get('カスタムフィールド名'); ?> </td> </tr> <?php endif; ?>
こういった形で表示させれば問題ないかなと思いましたが「何故かサブループ(ループ内ループ)ではget_post_metaが使用できなかった」です。
解決方法
2-3時間ほどググってわかった内容ですが、以下の通りにすると解決しました。
念のため全体を見ながらの方がわかりやすいです。
<?php $fields = $cfs->get('親ループ'); foreach ((array)$fields as $field) { echo '<h2>'.$field['タイトル'].'</h2><table>'; $fieldloops = $field['子ループ']; foreach ($fieldloops as $fieldloop) { echo '<tr><th>'.$fieldloop['メニュー名'].'</th>'; echo '<td>'.$fieldloop['価格'].'</td></tr>'; $subloop = $fieldloop['説明']; if($subloop) : echo '<tr><td colspan="2">'.$fieldloop['説明'].'</td></tr>'; endif; } echo '</table>'; } ?>
こういった記載方法だと未入力の情報に関しては非表示にする事が出来ました。
注意点としてはカスタムフィールドの呼び出しを$field[”]と$fieldloop[”]の2種類使っている事でしょうか。
以上でCustom Field Suiteのサブループ内で未入力の内容のみを非表示にする方法の説明を終了致します。
さいごに
今回もGoogleさんに助けられました
色々な技術的なブログを拝見させて頂きましたが、ほとんどがCustom Field Suiteの表示と分岐の入力がない場合の分岐に書かれている事で止まってしまっていました。
ブログを書いている人はさらに前に進んだカスタマイズをしていない方が多いんでしょうね。