タクソノミーのアーカイブを擬似的に作り出す
タクソノミーのアーカイブ(つまり、タクソノミー内のいずれかのタームに属するものの全一覧)を作りたかったんだが、普通にhttp://xxxxx.com/タクソノミースラッグ/とかやっても出てこなかった。
まぁ、それもそのはず。
このタクソノミースラッグって要はカテゴリーで言うところのcategory(URLに直すとhttp://xxxxx.com/category/)なわけだし、そんなところにアクセスしたとしても当然アーカイブなんてものは存在はしない。
でも今作ってるワンオフサイトの仕様上、どうしてもタクソノミーのアーカイブを作りたかったわけで、それを擬似的に作り出すようにしてみた。
まず前提。
タクソノミーアーカイブからは少し離れてみて、トップページの記事一覧とは別に投稿の記事一覧を表示する方法がある。
固定ページに対してWP_Queryやget_postsでpost_type=’post’を指定して、擬似的なアーカイブを作り出すという一般的な方法である。
要は、既に記事一覧のアーカイブをトップページで使ってるやん!なら固定ページに本来の記事のアーカイブを出してくるようにコードを書けばいいやん!ということである。
で、タクソノミーアーカイブに話を戻すと、単にこれがタクソノミーに置き換わるだけの話であり、もとを正せば、これと同じ仕組みを利用すればいいのである。
つまり、アーカイブ化したいタクソノミー内のいずれかのタームに属するものの記事を全て取ってくればいいということだ。
準備として、
- 固定ページにタクソノミーアーカイブとして表示する空のページを登録する。
- テーマ側に「page-固定ページスラッグ.php」というのを用意する。
以上のことをやっておく。
準備ができたら、今度は2.の「page-固定ページスラッグ.php」でタクソノミーのアーカイブを引っ張ってくるようにする。
そのために「page-固定ページスラッグ.php」には以下の例のようにテンプレートを記述する。
(この例ではWP_Queryを用いている。)
global $wp_query; $post_type = 'post_type_slug'; $tax_slug = 'taxonomy_slug'; $terms = get_terms( $tax_slug ); $array = array(); foreach( $terms as $term ) : array_push( $array, $term->term_id ); endforeach; $query = new WP_Query( array( 'post_type' => $post_type, 'tax_query' => array( array( 'taxonomy' => $tax_slug, 'terms' => $array, 'field' => 'term_id', 'operator' => 'IN', ), ), 'paged' => get_query_var( 'paged' ), ) ); $wp_query->max_num_pages = $query->max_num_pages; if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ~~~ endwhile; endif; wp_reset_postdata();
$tax_slugには、直書きなりプラグインを利用して作ったタクソノミーのスラッグ名を入れる。
$post_typeはタクソノミーが投稿タイプへの一意の設定であれば別にいらないと思う。(念の為に入れてるけど)
試してないが恐らくページャーやページネーションにも対応できている…はず。
(自分のテスト上では特に問題なかったけど)できてなかったらごめんね!