目次
環境
- 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を使ってこれを回避している。なるほど。