get_postsで特定のカスタムタクソノミーのタームのみに該当する投稿を抽出する

get_postsで投稿を絞り込む際に、カスタムタクソノミーで絞り込みをしたい、という状態に遭遇して調べたのでメモしておきます。

<?php
$get_posts_args = [
    'order' => 'ASC',
    'orderby' => 'ID',
    'post_type' => 'post',
    'post_parent' => 0
];
$get_posts_args['tax_query'] = [
    [
        'taxonomy' => 'TAXONOMY_SLUG',
        'field'    => 'slug',
        'terms'    => 'TERM_SLUG'
    ]
];
$posts = get_posts( $get_posts_args );

書き方としてはこんなイメージ。TAXONOMY_SLUGはタクソノミーのスラッグ(カテゴリーならばcategoryなど、カスタムタクソノミー全体のスラッグ)、TERM_SLUGはカスタムタクソノミーに属すターム(カテゴリーの中の「雑記」や「未分類」のようなもの)のスラッグを記述します。

今回は階層あり(カテゴリーと同じようにチェックボックスで選択するタイプ)のカスタムタクソノミーとしたので、該当タームにチェックが付いていればヒットし、チェックが入ってない投稿はこの条件では抽出されない、という挙動になります。

Codexにはtax_queryの記載がないため戸惑いましたが、可能ということでメモ。

余談

get_postsの段階ではなく、それより後(get_postsでいったん抽出し、その中から再度探す)という場合はhas_termsというテンプレートタグが使えたので併せて記載しておきます。

<?php
foreach ( $posts as $post ) { //get_postsで抽出した投稿オブジェクトに対してforeach
    if(has_term( 'TERM_SLUG', 'TAXONOMY_SLUG', $post->ID )) { //投稿オブジェクトが該当タームを持つか判定
        //タームを持つ投稿の場合の処理
    }
}

参考

get_posts

has_terms

この記事を書いた人

アバター

アルム=バンド

フルスタックエンジニアっぽい何か。LAMPやNodeからWP、gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。