Web制作・開発会社 プレスマンのスタッフブログ

PRESSMAN*Tech

ACFでリピーターフィールドの値を取得する時には型に注意する

リピーターフィールドを使用すると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
]
空配列とはならず、falseが1件登録された配列となるため
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の値を取得する時にはリピーターフィールドの値を取得しようとしているのか、他のフィールドタイプの値を取得しようとしているのか決まっている状態だと思うので
リピーターフィールドの値取得時のみこの関数を使用するのが良いかと思います。

まとめ

ACFでリピーターフィールドを扱うときに発生するWARNINGの説明と、回避するためのアイディアとして作成する関数を紹介しました。 ACFは便利ですが、提供される関数の返却値の型がmixedの場合があるので
使う場合はドキュメントやPHPDocsを読み、どのような型の値が返却されるのか確認してから使うようにしましょう。