【WordPress】複数選択にしたACFの「投稿オブジェクト」を表示する

Advanced Custom Fieldsを利用したカスタムフィールドはこのブログでも良く使ってますが。

その中でも個人的に便利だなぁと思っているのが、「投稿オブジェクト」フィールドです。

ワードプレスでデータ管理のような事をしようとすると、

・データベースを直接操作する
・投稿をデータベースとみなす

のどちらかで組み上げていく印象です。

が、個人的にはワードプレスを利用している時点で、あまりデータベース操作はしたくないので。

2つ目の「・投稿をデータベースとみなす」で進めることが多いです。

なので、投稿という形で作成したデータを取り出すのに、投稿オブジェクトが使いやすいんですよね。

ただ、あまり「Select Multiple」(ちゃんと日本語化されていると、「複数選択を許可する」ですかね?)は使ったことがなかったので。

利用する時にちょっとつまずきました。

単一の選択肢の場合

Advanced Custom Fieldsの投稿オブジェクトフィールドの選択肢を単一にすれば、

//投稿タイトルを取得する場合
get_field( '投稿オブジェクトのフィールド名', $post_id )->post_title;

//投稿内のデータを呼び出す場合はIDに変換する
$target_id = get_field( '投稿オブジェクトのフィールド名', $post_id )->ID;
//パーマリンクとか
get_the_permalink( $target_id );

というように取得できます。あ、「戻り値の形式」を「投稿オブジェクト」にしている場合ですね。

「投稿ID」にするとget_field()だけでIDを取得できます。

複数選択可にすると

これを複数選択にするとどうなるのかを、試してみたところ。

ドロップダウンリストの選択で、POST送信だから配列だろうなと思っていてそれは合ってましたが。

配列は合っても投稿データが入っていませんでした。

なのでget_field()を使っても、何も表示することができません。

投稿オブジェクトだから、選択した投稿のデータをひっぱてきてるのかとも思いましたが、そんな事はなかったようです。

で、配列の中には数字の羅列が入っていたので、それが何かと調べてみると、どうやら投稿IDが配列の中に入っているようでした。

念のため選択した投稿のIDを調べてみると一致してましたし。

試しに投稿する時のフォームのvalue値を調べてみると、選択した段階で投稿IDを取得し、それをデータベースに渡しているというような挙動でした。

じゃあforeach文で配列内にあるIDを実行してもらえば良いか・・・とも思いましたが、どうにもうまく取得できないので、別の方法を調べてみることに。

setup_postdata()を使う

投稿データを呼び出すのであれば、ワードプレス関数を利用する方が分かりやすいので。

setup_postdata()で投稿データを生成することに。

//投稿オブジェクトの配列を取得する
$array_field = get_field( 'test-field', $post_id );

//foreachで配列分表示させる
foreach( $array_field as $post ){
  setup_postdata( $post );
  //投稿データを表示。例えばタイトル
  echo the_title();
}
//global変数を変更しているためリセット
wp_reset_postdata();

setup_postdata()はグローバル変数の$postの内容を変更するため、関数に渡す変数も$postじゃないと正常に動作しないようです。

そして、$postを元の投稿上方に戻すため、忘れずにwp_reset_postdata()でリセット。

これで無事、投稿のタイトルを取得することができました。

他のデータも取得したくなったら、the_ID()も使えるので問題ないでしょう。

結構ハマりました

そもそも、「投稿オブジェクト」フィールドに入力されたデータが、投稿にどう保存されているかを知らなかったので、呼び出す方法についてもマニュアル程度にしか知りませんでした。

返り値を「投稿ID」にしておけばとも思いましたがー。なんでもかんでもIDをで指定するようにするのは、ワードプレスを使っている利点がなくなるなと。

投稿オブジェクトはあくまで投稿データを取得するフィールドなので、投稿情報を呼び出す方が色々と便利そうだなと思いました。

参照:ACFで複数の投稿オブジェクトを一番簡単にForeachで出力・表示する方法‐brandnew