AdvancedCustomFieldsとは?
WordPressのカスタムフィールドを便利にしてくれるAdvancedCustomFieldsというプラグインがあります。
- ACF { Advanced Custom Fields Plugin for WordPress
- 【WordPress】Advanced Custom Fieldsでカスタムフィールドを自在に操る方法 | KLUTCHE
- 僕がAdvanced Custom Fields(アドバンスドカスタムフィールズ)を選んだ理由 | ホームページ制作,群馬,アーチWeb制作室
フィルターもたくさん用意されており、カスタマイズもかなり細かいとこまでできちゃいます。
非常に強力でいつもお世話になっているプラグインなのですが、一点だけ問題があります。
それはカスタムフィールドの値をするための専用の関数、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 〜〜〜〜〜
これはエラーというか正確には警告で、配列で渡すはずの第一引数が文字列になっているために出力されるされるようです。
付け焼き刃での解決策
これは警告なので、基本的には無視しても問題ありません。
.htaccess
やfunctions.php
で出力しないよう設定すれば一応解決します。
php_flag display_errors Off
# 以下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を使う人の助けになればこれ幸いであります(・ω・)ノ