2017年以前の旧ブログ

BLOG2017

タクソノミー複数のカスタム投稿あれこれ

ダーシノ Other Blog

前回のタクソノミー別、カスタム投稿呼び出しに追加でタクソノミーが複数だった場合のやり方をメモ。

タクソノミーが複数の時

カスタム投稿タイプ: cpt_type
タクソノミー1:tax1
タクソノミー2:tax2

カスタム投稿複数ターム毎一覧出力

該当するタームの記事を一覧で出力します。

<?php
$paged = get_query_var('paged');
$arg = array (
'post_type' => 'cpt_type',
'paged' => $paged,
'posts_per_page' => '10',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'tax1',
'field' => 'slug',
'terms' => array($cg1),
'operator' => 'IN'
),
array(
'taxonomy' => 'tax2',
'field' => 'slug',
'terms' => array($cg2),
'operator' => 'IN'
)));
$myposts = query_posts($arg);
if (count($myposts) > 0) {
if(have_posts()):
while(have_posts()):
the_post();
?>
<!--投稿内容呼び出し-->
<?php endwhile; endif; ?>
<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
<?php } wp_reset_query(); ?>

 
上記でタクソノミー1のcg1、タクソノミー2のcg2、両方に該当する記事を出力します。
relationは検索条件の結合方法ですが、ANDとORが設定できます。
cg1、cg2はただの変数ですので好きに値を代入して利用してください。

複数タクソノミーでそれぞれ違う使い方

先ほどの複数タクソノミーの設定を利用して、タクソノミー1の1タームに属するタクソノミー2をターム毎に一覧で出力する方法を考えてみます。
タクソノミー1
> ターム1-1
> ターム1-2
タクソノミー2
> ターム2-1
> ターム2-2
とある場合、一覧ページにターム1-1に該当する記事を
ターム2-1
・投稿記事
・投稿記事
・投稿記事
ターム2-2
・投稿記事
・投稿記事
のように出力する。
まずはタクソノミー2に該当する記事をターム毎に一覧整列させます。

<?php
$categoryList = get_terms('tax2',array(
'taxonomy' => 'tax2',
'orderby' => 'order',
'order' => 'ASC',
));
foreach($categoryList as $news_term_item) {
$my_slug[] = $news_term_item->slug;
$my_name[] = $news_term_item->name;
}
$num = count($my_slug); for($a = 0; $a < $num; $a++) {
$cg2 = $my_slug[$a] //term slug
?>
<!--タクソノミー毎記事一覧呼び出し-->
<?php }; ?>

タクソノミー2のターム一覧表示を利用して、記事の一覧を表示します。
さらにタクソノミー1のいずれかのタームがスラッグで選択されると想定して

<?php
if(isset($_GET['cg'])) {
$cg1 = $_GET['cg'];
}
$categoryList = get_terms('tax2',array(
'taxonomy' => 'tax2',
'orderby' => 'order',
'order' => 'ASC',
));
foreach($categoryList as $news_term_item) {
$my_slug[] = $news_term_item->slug;
$my_name[] = $news_term_item->name;
}
$num = count($my_slug); for($a = 0; $a < $num; $a++) {
$cg2 = $my_slug[$a] //term slug
?>

<?php
$paged = get_query_var('paged');
$arg = array (
'post_type' => 'cpt_type',
'paged' => $paged,
'posts_per_page' => '10',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'tax1',
'field' => 'slug',
'terms' => array($cg1),
'operator' => 'IN'
),
array(
'taxonomy' => 'tax2',
'field' => 'slug',
'terms' => array($cg2),
'operator' => 'IN'
)));
$myposts = query_posts($arg);
if (count($myposts) > 0) {
if(have_posts()):
while(have_posts()):
the_post();
?>
<!--投稿内容呼び出し-->
<?php endwhile; endif; ?>
<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
<?php } wp_reset_query(); ?>

<?php }; ?>

以上でタクソノミー1のターム1-1に該当するタクソノミー2をターム毎で記事を一覧表示できました。
内容がピンポイントすぎますが、何かしら応用できたらいいなーと思ってます。