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