WordPressで特定のカスタムタクソノミーを持つカスタム投稿タイプの記事を取得する
タクソノミーとはざっくり言うとWordPressの投稿に紐付いている「カテゴリー」みたいなものです。このタクソノミーは自由に何種類でも作ることができるものです。
WordPressで特定のカテゴリー、特定のタグを持つ記事を取得する方法は以前紹介しましたが、カスタムタクソノミーの場合はこの2つとは少し違った方法になります。
カスタム投稿タイプの記事を取得する方法
まずはカスタム投稿タイプ別に記事を取得する方法を簡単におさらいします。
登録されているカスタム投稿タイプをパラメーターの post_type に指定することで検索できます。
以下の例では「contents」を post_type に渡します。
functions.php
<?php // カスタム投稿タイプ登録 $labels = [ // 省略 ]; $args = [ 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'hierarchical' => false, 'menu_position' => 5, 'supports' => ['title', 'editor', 'thumbnail'] ]; register_post_type('contents', $args); // contentsが検索に使うカスタム投稿タイプ名 ?>
テーマファイル
<?php $args = [ 'post_type' => 'contents', 'post_count' => 5, 'paged' => get_query_var('paged') ? intval(get_query_var('paged')) : 1, ]; $the_query = new WP_Query($args); ?> <ul> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li><?php the_time('Y/m/d') ?> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul>
カスタムタクソノミーを登録する
カスタムタクソノミーの登録時は登録したい投稿タイプを指定します。WordPressにすでにある「カテゴリー」で言えば「投稿」に当たるものです。
以下の例では「contents-cat」というタクソノミーを新たに登録しています。
投稿タイプ「contents」だけが「contents-cat」を選択することができます。
<?php register_taxonomy( 'contents-cat', // 登録するタクソノミー名 'contents', // タクソノミーを登録したいカスタム投稿タイプ名 array( 'hierarchical' => true, 'update_count_callback' => '_update_post_term_count', 'label' => '作品カテゴリー', 'public' => true, 'show_ui' => true, ) ); ?>
カスタム投稿タイプをカスタムタクソノミーで絞り込む検索方法
それではこのカスタム投稿をカスタムタクソノミーで絞る方法を紹介します。
記事が持つタクソノミーの絞り込みは tax_query を使う
カテゴリーではcat(category)、タグではtag_idなどをパラメーターに使いますが、カスタムタクソノミーでは tax_query を使用します。
tax_query では複数のタクソノミーで絞り込める上、AND検索・OR検索を切り替えることができます。
カスタムタクソノミーを検索条件に含む
例1: contents-cat「photo」を持つ投稿タイプ「contents」を取得する
<?php $args = [ 'post_type' => 'contents', // 検索したいカスタム投稿タイプ 'tax_query' => [ [ 'taxonomy' => 'contents-cat', // 絞り込みたいカスタムタクソノミー 'field' => 'slug', // スラッグで検索。idでも検索できます 'terms' => 'photo', // 検索する文字列(fieldがidならidが入ります) 'include_children' => true, // 子タクソノミーを含むかどうか 'operator' => 'AND' // termsが複数ある場合AND検索(全て)かIN検索(いずれか)かNOT IN(いずれも除く) ] ], 'post_count' => 5, 'paged' => get_query_var('paged') ? intval(get_query_var('paged')) : 1, ]; $the_query = new WP_Query($args); ?>
例2: contents-type「sky」「flower」を両方持ち、かつcontents-cat「photo」を持つ投稿タイプ「contents」を取得する
<?php $args = [ 'post_type' => 'contents', 'tax_query' => [ 'relation' => 'AND', // 下の検索条件全てに合致するか(いずれか、ならORを指定) [ 'taxonomy' => 'contents-type', 'field' => 'slug', 'terms' => ['sky', 'flower'], 'operator' => 'IN', ], [ 'taxonomy' => 'contents-cat', 'field' => 'slug', 'terms' => 'photo', 'operator'=>'AND' ] ], 'post_count' => 3, 'paged' => get_query_var('paged') ? intval(get_query_var('paged')) : 1, ]; $the_query = new WP_Query($args); ?>
かなり詳細な検索ができるようになりました。
タクソノミー自体もAND、IN、NOT INが使えるので割と複雑に絞り込みができます。