ACFの“get_field()”が画像を返してくれなかった問題

ACF公式サイトのスクリーンショット
ACF | Advanced Custom Fields Plugin for WordPress

イントロ

固定ページdiaryに、ACF(Advanced Custom Fields)の“ギャラリー”フィールドgalleryを使いスライドショーを表示していた。

get_field()の返り値が変

ここから本題。そのgalleryの画像たちを他のページ、ここでは固定ページportfolioでも使いたくなったので、次のようにget_field()の第2引数にページIDを渡しての取得を試みた。

page-portfolio.php

…
$gallery = get_field( 'gallery', $page_id );
…

しかし!変数$galleryには2つの画像データしか返って来ないのである。たとえ画像が6枚10枚、galleryに追加されていようとだ。ここで$page_idは間違いなくgalleryを埋め込んでいる固定ページ、すなわちdiaryのID番号と一致していることは確認した。なぜだ…。

一方galleryが埋め込まれている固定ページdiaryではお決まりのコードでちゃんと動いている。

page-diary.php

…
$gallery = get_field( 'gallery' );
…

はてどうしたものか。

結論: get_field()のバグ!

ACF公式フォーラムの記事を漁っていると、どうやらget_field()のバグが関連しているらしかったので、代わりにWordPressの関数で取得してはどうか、というアンサーを発見。そっか!
Gallery images not displaying on SOME pages - ACF Support

最終的にたどり着いたコードがこちら。

page-portfolio.php

…
$imageIDs = get_post_meta( $page_id, 'gallery' );
$size = 'medium';
$images = array();
foreach ( $imageIDs[0] as $imageID ) {
  $image = wp_get_attachment_image_src( $imageID, $size );
  if ( $image ) {
    $images[] = $image[0];
  }
}
…

解決策の要にして最初のステップがget_post_meta()。これでgalleryに紐付けられている画像たちのIDを取得。$imageIDsには次のような配列が返る。

array(1) {
  [0]=>
  array(5) {
    [0]=>
    string(3) "152"
    [1]=>
    string(3) "153"
    [2]=>
    string(3) "154"
    [3]=>
    string(3) "155"
    [4]=>
    string(3) "156"
  }
}

各々の数値(152,153など)は画像のIDである。ちゃんとgalleryに入っている画像すべて(5枚分)のIDが返ってきている!!

これをforeachで回してwp_get_attachment_image_src()で画像データを取得。これは次のような配列を返す関数。もし見つからなければfalseを返す。

array(4) {
  [0]=>
  string(56) "http://localhost:8888/wp-content/uploads/2021/06/slide-01.jpg"
  [1]=>
  int(1600)
  [2]=>
  int(900)
  [3]=>
  bool(false)
}

最終的に、URLだけを取得して配列$imagesが完成。

array(5) {
  [0]=>
  string(56) "http://localhost:8888/wp-content/uploads/2021/06/slide-01.jpg"
  [1]=>
  string(56) "http://localhost:8888/wp-content/uploads/2021/06/slide-02.jpg"
  [2]=>
  string(56) "http://localhost:8888/wp-content/uploads/2021/06/slide-03.jpg"
  [3]=>
  string(65) "http://localhost:8888/wp-content/uploads/2021/06/slide-04.jpg"
  [4]=>
  string(65) "http://localhost:8888/wp-content/uploads/2021/06/slide-05.jpg"
}

晴れて無事、galleryに追加した全画像を取得できた。

結局のところ、get_field()のどの部分が悪さをしていてこのようなバグが発生しているのか突き止めることは出来なかったが、今後のアップデートでの修正を期待したい。


おまけ: ページIDの取得方法

ちなみに、固定ページgallery$page_idは次の方法で取得できる。

$page_object = get_page_by_path( 'gallery' );
$page_id = ( $page_object ) ? $page_object->ID : null;

get_page_by_path()関数に固定ページのスラッグ名を渡すと、次のようなWP_Postオブジェクトを返してくれる。そこからIDを取得する。下記の場合は“5”がgalleryページのID番号。

object(WP_Post)#5656 (24) {
  ["ID"]=>
  int(5)
  ["post_author"]=>
  string(1) "1"
  ["post_date"]=>
  string(19) "2021-06-23 17:00:00"
  ["post_date_gmt"]=>
  string(19) "2021-06-23 08:00:00"
  ["post_content"]=>
  string(0) ""
  ["post_title"]=>
  string(18) "日記"
  ["post_excerpt"]=>
  string(0) ""
  ["post_status"]=>
  string(7) "publish"
  ["comment_status"]=>
  string(6) "closed"
  ["ping_status"]=>
  string(6) "closed"
  ["post_password"]=>
  string(0) ""
  ["post_name"]=>
  string(5) "gallery"
  ["to_ping"]=>
  string(0) ""
  ["pinged"]=>
  string(0) ""
  ["post_modified"]=>
  string(19) "2021-06-24 10:00:00"
  ["post_modified_gmt"]=>
  string(19) "2021-06-24 01:00:00"
  ["post_content_filtered"]=>
  string(0) ""
  ["post_parent"]=>
  int(0)
  ["guid"]=>
  string(29) "http://localhost:8888/?page_id=5"
  ["menu_order"]=>
  int(0)
  ["post_type"]=>
  string(4) "page"
  ["post_mime_type"]=>
  string(0) ""
  ["comment_count"]=>
  string(1) "0"
  ["filter"]=>
  string(3) "raw"
}

以上、報告おわり!

8861649050224012765 https://www.storange.jp/2021/06/acf-get-field-problem.html https://www.storange.jp/2021/06/acf-get-field-problem.html ACFの“get_field()”が画像を返してくれなかった問題 2021-06-28T15:30:00+09:00 https://www.storange.jp/2021/06/acf-get-field-problem.html Hideyuki Tabata 200 200 72 72