読者です 読者をやめる 読者になる 読者になる

ファイヤードブログ

ディジタル・パブリッシングという観点から、Webサイト制作、電子書籍制作などを。※ブログリニューアル中

publicの値をfalseにしたカスタム投稿に属するタクソノミーの一覧表示で起こる問題とその解決方法

WebDev WordPress pitfalls

 一覧でのみ使いたい投稿タイプというものがあります。そのための一つの方法は、register_post_typeで新たにカスタム投稿を定義する際に、publicの値をfalseにするものがあります。先にコードを示してしまいます。

<?php
//カスタム投稿carのpublicをfalseにして詳細ページを生成しないようにする。
register_post_type(
  'car',
    'public' => false,
    //省略
);
//carに付随するカスタムタクソノミー、makerを定義
register_taxonomy(
  'maker',
  'car',
  //後略
);
?>

 以上のように定義したとして、makerの一覧である、taxonomy-maker.phpを作ってそこで表示させようとするとトラブルがおきてしまいます。それは、メインのループでは、publicの値がfalseの投稿は表示されないということです。ここで、フックを使う方法も考えられるのですが、とりあえずの解決のために、慣れているサブループによる解決をやってみようと思います。
 makerタクソノミーのある値(例えば、TOYOTAとか)のページ(example.com/maker/toyota)にアクセスしたと仮定します。taxonomy-maker.phpを作成していますから、このテンプレートが適用されます。

<?php
$current_tax = single_term_title("", false);  
// example.com/maker/toyota を開いた場合、変数$current_taxの値は'toyota'になります。
$maker_posts = new WP_Query(array(
	'post_type' => 'car',
	'maker' => $current_term, 
));
if($maker_posts->have_posts()):
	while($maker_posts -> have_posts()): $maker_posts ->the_post();
		get_template_part('content-maker');
	endwhile;
	wp_reset_postdata(); //忘れ安いので注意
endif;
?>

 ポイントは、single_term_title()とWP_Queryでの、「'タクソノミー名' => 値」がすぐに思いつくか、でしょう。これで一件落着なのですが、やはりなんでもかんでもサブループを回すとパフォーマンスにも影響しそうなので、いつかフックを使う方法もできれば公開するつもりです。