リピーターフィールドを使用するとWARNINGが発生する
ACFのリピーターフィールド、便利ですよね。複雑なデータの持ち方をするシステムではよくお世話になっています。 以下コードのようにリピーターフィールドにて保存したデータを
get_field
関数で取得し、foreach
等で処理しているとWARNINGが発生することが多々あります。
$repeater = get_field( 'field_name' );
foreach( $repeater as $key => $row ) {
.....
}
何故WARNINGが発生するか
get_fieldの仕様として、ACFの項目がデータベース内にpostmetaとして保存されていない場合等にfalse
が返却されます。falseが返却されることを考慮せず、リピーターフィールドの値をget_fieldで取得しforeachで扱うと
WARNINGが発生する場合があります。 WordPressの管理画面から保存すれば、ACFの項目はmetaに保存されますが
複雑なシステムの場合、管理画面からの保存以外にインポート系プラグインによる登録や、裏側でバッチ処理による登録があるかと思います。
その時にリピーターフィールドの値が保存されていないケースが発生し、falseが返却されます。
単純な型変換では解決しない
$repeater = (array)get_field( 'field_name' );
falseの場合、postmetaに値が無いため空配列として扱いたいですが
falseをそのまま型変換しても、以下のような値になってしまいます。
[
0 => false
]
foreachが内の処理が1度走ってしまい、意図せぬバグに繋がります。
リピーターフィールド専用の取得関数を作成する
get_fieldで取得した値を都度 is_arrayで型確認すれば良いのですがそのようなコードを書く箇所で散りばめるのは可読性が悪くなるので、以下のような関数を作成することをオススメします。
function get_repeater_field( $selector, $post_id = false, $format_value = true ) {
$value = get_field( $selector, $post_id = false, $format_value );
if ( $value === false ) {
$value = [];
}
return $value;
}
リピーターフィールドの値取得時のみこの関数を使用するのが良いかと思います。
まとめ
ACFでリピーターフィールドを扱うときに発生するWARNINGの説明と、回避するためのアイディアとして作成する関数を紹介しました。 ACFは便利ですが、提供される関数の返却値の型がmixedの場合があるので使う場合はドキュメントやPHPDocsを読み、どのような型の値が返却されるのか確認してから使うようにしましょう。