Because We Love Happy Coding

フリーライターからエンジニア × 講師。発信力だけあり余ってる感じ

Custom Fieldの関連(relationship)をカテゴリ的に使ったら関連する投稿数が欲しくなった

今日もまたコーディング。だって僕らはHappy Codingが大好きだから。

目次

環境

  • 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を使ってループしないとできないような予感が……。

まさにそういう事例があった。

これだわー。やっぱ二重にループしないと無理かー。

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