LoginSignup
7
9

More than 5 years have passed since last update.

AdvancedCustomFieldsのget_fieldをforeachで使うときの注意点

Last updated at Posted at 2013-11-27

AdvancedCustomFieldsとは?

WordPressのカスタムフィールドを便利にしてくれるAdvancedCustomFieldsというプラグインがあります。

フィルターもたくさん用意されており、カスタマイズもかなり細かいとこまでできちゃいます。

非常に強力でいつもお世話になっているプラグインなのですが、一点だけ問題があります。

それはカスタムフィールドの値をするための専用の関数、get_field()についてです。

get_field()の返り値でハマる

例えば以下のコード。

<?php echo get_field('hoge'); ?>

カスタムフィールドhogeの値を取得して表示する単純なコードです。
hogeに登録されている値が1つなら正常に表示されます。

しかし、WordPressのカスタムフィールドは同じキー名で複数の値が登録できます。
hogeという名前で2つ以上の値が表示されていた場合、上記のコードはArrayと出力されます。

これは便利は便利なのですが、同一キー名で 1つ以上 の値を登録して、 foreach() を使って表示するときに問題が起きます。

例えば以下のコードです。

<?php
  foreach(get_field('hoge') as $field) :
    echo $field;
  endforeach;
?>

上記のコードは、hogeに登録されている値が1つであろうと、0であろうと1万であろうと、一応問題なく動作します。

しかしサーバーの環境によっては、hogeに登録されている値が1つのとき、以下のようなエラーが出力されます。

Warning: Invalid argument supplied for foreach() in 〜〜〜〜〜

これはエラーというか正確には警告で、配列で渡すはずの第一引数が文字列になっているために出力されるされるようです。

付け焼き刃での解決策

これは警告なので、基本的には無視しても問題ありません。
.htaccessfunctions.phpで出力しないよう設定すれば一応解決します。

php_flag display_errors Off
functions.php
# 以下2つ、どちらでもOK
error_reporting(0);
ini_set('display_errors', '0');

しかし上記の方法だと、他のエラーや警告も全部出力されなくなるので、それはそれで問題となります。

根本的な解決策

なんとかならんかなーと考えた結果が以下のコードです。
(前述したリンクに同じことが書いてあります。)

<?php
  foreach((array)get_field('hoge') as $field) :
    echo $field;
  endforeach;
?>

get_field()の前に(array)を付けて、文字列だろうと無理やり配列に型変換しています。

フィルターを使ってget_field()の返り値を配列で固定してしまうことも考えたのですが、問題となるのはget_field()foreach()で使った場合だけなので、これで統一することにしました。

これからAdvancedCustomFieldsを使う人の助けになればこれ幸いであります(・ω・)ノ

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9