皆さんはAdvanced Custom Field(以下 ACF)の投稿オブジェクトを使用したことがありますか?

今回はACFの投稿オブジェクトで複数選択オプションをTrueにした際のデータ取得方法です。

では回していきましょう。

# この記事で解決すること

  • ACFの投稿オブジェクトをforeachで取得できる
  • 投稿オブジェクト(カスタム投稿タイプ含む)を$postとして扱える

前提

今回はtemplate化したものに対して投稿オブジェクトをループさせることとします。

フォルダ構成は下記のとおりです。

  • theme_name
    • template
      • parts-post.php
    • page-test.php

 

また、ACFの投稿オブジェクトの戻り値を投稿オブジェクトに、複数選択オプションをTrueに設定していることを前提とします。

手順

  1. テンプレートの作成
  2. foreachで処理
  3. 確認

テンプレートの作成

わかりやすいように、すごく簡単なテンプレートにします。

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_postdatasetup_postdataのリセットに必要となりますので、書き忘れないように注意してください。

 

これで問題なく取得ができます。

また、post前提で書いていますが、カスタム投稿タイプでも同じようにできますので、すごく便利です。

確認

問題なく投稿が表示されていますね。

せっかくなので、8行目のwp_reset_postdataを書いた場合と書いていない場合に起こるthe_title()の表示の違いも見ておきましょう。

wp_reset_postdataを書いた場合

wp_reset_postdataを書いていない場合

書いていない場合は、最後の投稿の情報が引き継がれてしまっているのがわかると思います。

特に$postに関してはWordpressに置いて重要な変数ですので、リセットを書き忘れないよう注意してください。

最後に

以前までは投稿の複数件登録は繰り返しフィールドを使用していましたが、投稿オブジェクトでも十分すぎるので切り替えるようにしました。

ACFにはまだまだ様々な機能がありますので、今後もACFに関する記事を書いていきたいと思います。