目次
環境
- WordPress 5.2.2
- Advanced Custom Fields(以下ACF)
関連のreverseな関係
書籍を紹介するブログを作っていて、投稿タイプpost
を本1冊にわりふることにし、作者は新たにauthors
というカスタム投稿タイプを作ることにした。
postには関連カスタムフィールドauthor
がつけてあり、authors
タイプを1つ以上付けることができる。
さて、ブログのウィジェットに作者一覧を付けて、書籍の数もそこに表示したいと思ったのだけれど、クエリの書き方がどうも今一つピンとこない。
wp_query
のクエリでサブループを作ってauthors
タイプを全部呼び出すところまではわかる。the_post
してauthors
を一つずつ呼び出し、the_title
すれば作者名の一覧はできる。しかし、この作者に対して紐付けを盛っているpost
の数となると、これはどう書けばいいのだろう?
なんとなく、二重にwp_query
を使ってループしないとできないような予感が……。
まさにそういう事例があった。
- How to get the number of posts from Relationship field - for "reverse" posts? - ACF Support
- ACF | Querying relationship fields
これだわー。やっぱ二重にループしないと無理かー。
wp_reset_query()
は二重サブループをすべて解除してしまう
WP_Query()
を二重にサブループしたら挙動がおかしくなり、うまくいかない。
なぜかと思ったら、wp_reset_query()
またはwp_reset_postdata()
のせいだった。
内側のWP_Query()
の中でwp_reset_query()
をしたらなんとなく外のサブループに行ってくれる気がしていたが、そうではなくて、全部解除されてメインループに跳んでしまう。
$args = array( 'post_type' => 'authors', 'posts_per_page' => '20', ); $authors = new WP_Query( $args );//外のサブループ while ($authors->have_posts()) : $authors->the_post(); $args_sub = get_posts(array( 'post_type' => 'post', 'meta_query' => array( array( 'key' => 'authors', 'value' => '"' . get_the_ID() . '"', 'compare' => 'LIKE' ) ) )); $posts_in_authors = new WP_Query($args_sub);//中のサブループ $post_count = count($posts_in_authors); wp_reset_query(); //ここで$posts_in_authorsも$authorsもリセットされてメインループに跳んでしまう $authors_data .= '<a href="' . get_permalink() . '" class="c-authors_list__item">'.get_the_title() . '</a>';//ここはメインループのページのタイトルが表示されてしまう endwhile; wp_reset_postdata();//無意味
本文中でならまだしも、ウィジェットの中ではこれは困る。
上記のHow to get the number of posts from Relationship field - for "reverse" posts? - ACF Supportでは抜け目なくget_posts
を使ってこれを回避している。なるほど。