WordPressでアーカイブテンプレートを制作する際に、1つのアーカイブテンプレートで複数のアーカイブタイプを定義する方法。
ソースコード
$args = array(
"post_type"=> "post"
);
//カテゴリーアーカイブ
if(is_category()) {
$cat = get_query_var('cat');
if($cat) {
$args_cat = array(
"cat" => $cat
);
$args = array_merge($args , $args_cat);
}
}
//タグアーカイブ
if(is_tag()) {
$tag = get_query_var('tag');
if($tag) {
$args_tag = array(
"tag" => $tag
);
$args = array_merge($args , $args_tag);
}
}
//タクソノミーアーカイブ
if(is_tax()) {
$term = get_query_var('term');
$tax = get_query_var('taxonomy');
if($term) {
$args_term = array(
"tax_query" => array(
array(
'taxonomy' =>$tax,
"field"=>"slug",
"terms"=>$term
)
)
);
$args = array_merge($args , $args_term);
}
}
//年別・月別アーカイブ
$year = get_query_var('year');
if($year) {
$args_year = array(
"year"=> $year
);
$args = array_merge($args , $args_year);
}
$month = get_query_var('monthnum');
if($month) {
$args_month = array(
"monthnum"=> $month
);
$args = array_merge($args , $args_month);
}
$day = get_query_var('day');
if($day) {
$args_day = array(
"day"=> $day
);
$args = array_merge($args , $args_day);
}
$the_query = new WP_Query($args);
解説
基本的に仕組みは現在表示しているページのアーカイブの種類をクエリから取得し、リクエスト条件を格納する配列にマージします。
$args = array(
"post_type"=> "post"
);
$argsという配列でpost_typeを定義します。
//カテゴリーアーカイブ
if(is_category()) {
$cat = get_query_var('cat');
if($cat) {
$args_cat = array(
"cat" => $cat
);
$args = array_merge($args , $args_cat);
}
}
//タグアーカイブ
if(is_tag()) {
$tag = get_query_var('tag');
if($tag) {
$args_tag = array(
"tag" => $tag
);
$args = array_merge($args , $args_tag);
}
}
//タクソノミーアーカイブ
if(is_tax()) {
$term = get_query_var('term');
$tax = get_query_var('taxonomy');
if($term) {
$args_term = array(
"tax_query" => array(
array(
'taxonomy' =>$tax,
"field"=>"slug",
"terms"=>$term
)
)
);
$args = array_merge($args , $args_term);
}
}
カテゴリーアーカイブかどうかを「is_category」で判定し、「get_query_var(‘cat’)」でカテゴリー情報を取得します。
カテゴリー情報が取得できたら配列に格納して、PHPのarray_merge関数で、最初に定義した$argsにマージします。
あとはタグとカスタムタクソノミーも同じことの繰り返しで「is_tag」「is_tax」で判定し、クエリから情報を取得、取得できたら配列に格納して、$argsにマージします。
//年別・月別アーカイブ
$year = get_query_var('year');
if($year) {
$args_year = array(
"year"=> $year
);
$args = array_merge($args , $args_year);
}
$month = get_query_var('monthnum');
if($month) {
$args_month = array(
"monthnum"=> $month
);
$args = array_merge($args , $args_month);
}
$day = get_query_var('day');
if($day) {
$args_day = array(
"day"=> $day
);
$args = array_merge($args , $args_day);
}
$the_query = new WP_Query($args);
年別、月別、日別などの時系列のアーカイブはアーカイブタイプの判定処理を行いません。
これはタクソノミーと時系列を組み合わせる場合があるからです。
get_query_var関数で時系列のクエリ情報が取得できた場合だけ、リクエスト用の配列にマージする形です。