【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をで指定するようにするのは、ワードプレスを使っている利点がなくなるなと。
投稿オブジェクトはあくまで投稿データを取得するフィールドなので、投稿情報を呼び出す方が色々と便利そうだなと思いました。