皆さんはAdvanced Custom Field(以下 ACF)の投稿オブジェクトを使用したことがありますか?
今回はACFの投稿オブジェクトで複数選択オプションをTrueにした際のデータ取得方法です。
では回していきましょう。
# この記事で解決すること
- ACFの投稿オブジェクトをforeachで取得できる
- 投稿オブジェクト(カスタム投稿タイプ含む)を$postとして扱える
前提
今回はtemplate化したものに対して投稿オブジェクトをループさせることとします。
フォルダ構成は下記のとおりです。
- theme_name
- template
- parts-post.php
- page-test.php
- template
また、ACFの投稿オブジェクトの戻り値を投稿オブジェクトに、複数選択オプションをTrueに設定していることを前提とします。
手順
- テンプレートの作成
- foreachで処理
- 確認
テンプレートの作成
わかりやすいように、すごく簡単なテンプレートにします。
parts-post.php
<div>
<h3>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</h3>
</div>
postとして取得してくるので、通常のWordpressの取得関数でリンクタイトルだけを表示するテンプレートにしました。
foreachで処理
今回は投稿オブジェクトのfield名をmy_posts
とします。
page-test.php
<?php
$my_posts = get_field('my_posts');
if($my_posts) {
foreach($my_posts as $post) {
setup_postdata($post);
get_template_part('template/parts', 'post');
}
wp_reset_postdata();
}
?>
5行目
setup_postdata($post)
で$post
を再定義しています。
setup_postdata()
の引数は$post
である必要があります。
例えば、上記の場合setup_postdata($hoge)
ではうまく動きませんので注意してください。
8行目
wp_reset_postdata
はsetup_postdata
のリセットに必要となりますので、書き忘れないように注意してください。
これで問題なく取得ができます。
また、post前提で書いていますが、カスタム投稿タイプでも同じようにできますので、すごく便利です。
確認
問題なく投稿が表示されていますね。
せっかくなので、8行目のwp_reset_postdata
を書いた場合と書いていない場合に起こるthe_title()
の表示の違いも見ておきましょう。
wp_reset_postdata
を書いた場合
wp_reset_postdata
を書いていない場合
書いていない場合は、最後の投稿の情報が引き継がれてしまっているのがわかると思います。
特に$postに関してはWordpressに置いて重要な変数ですので、リセットを書き忘れないよう注意してください。
最後に
以前までは投稿の複数件登録は繰り返しフィールドを使用していましたが、投稿オブジェクトでも十分すぎるので切り替えるようにしました。
ACFにはまだまだ様々な機能がありますので、今後もACFに関する記事を書いていきたいと思います。