BLOG

タクソノミーページで、あるタクソノミーを全ページに表示する

2014-04-20

簡潔なタイトルが難しい・・・

例えば、
カスタム分類名「area」、ラベル「エリア」を作り、「全国」「関東」「関西」で記事管理しているとします。
「全国」に分類された記事は、「関東」のアーカイブページでも「関西」のアーカイブでも、表示したい!
てな時の話です。

ちょうど「pre_get_post」のおさらいをしていたので、ちょうどよい題材でした。
functions.phpに、

add_action( 'pre_get_posts', 'set_baseTaxonomy' );
function set_baseTaxonomy( $query ) {
	$arg = array(
            'taxonomy' => 'area',
            'field' => 'slug',
            'terms' => 'zenkoku',
            'operator' => 'IN'
        );

	if ( !is_admin() && $query->is_main_query() ) {
		if ($query->is_archive) {
		$query->set('tax_query', array(
		'relation' => 'OR',
		$arg)
		 );
		}
	}
}

と書くと、どのページでも「全国」の分類記事が表示されるようになります。
‘taxonomy’ => ‘area’, や terms’ => ‘zenkoku’, は柔軟に変更ください。
また、’relation’ => ‘OR’, を’relation’ => ‘IN’, にすると、
『全国」かつ「関東」、のように2つに分類されている記事だけ抽出します。

便利な「pre_get_posts」

いろいろなサイトで「pre_get_posts」の説明をしてくれています。
「pre_get_posts」のいいところは、テンプレート前に処理をするので、無駄なくユーザーまでデータが進む点ですね。
テンプレートで、query_post などで処理をすると、
ユーザーURL叩く→WPがURLを解析する→それに合わせてDBから出す→テンプレート見る→query_postに絞り込み処理書いてる→またDB見に行く→テンプレートのwhileなど回す→ユーザー見る
のような流れになるようですが、「pre_get_posts」ですと、
ユーザーURL叩く→WPがURLを解析する→「pre_get_posts」のフィルタ見る→それに合わせてDBから出す→テンプレート見る→テンプレートのwhileなど回す→ユーザー見る
のように
query_postに絞り込み処理書いてる→またDB見に行く→
の処理が不要になるので、実によろしいようです。

どうしてもテンプレート内でしかできない処理もあるでしょうから、そのあたりはうまく使い分けることが肝要でしょう。
またいろいろ便利な処理を書いていきたいと思います。