今回新規のサイト制作時、あまりにカテゴリーが多すぎて、カスタム投稿毎のカテゴリーが必要だと思い、タクソノミーを使用して専用のカテゴリーを作成しました。
そこまでは良かったのですが、いつも通りカテゴリーページを作り、その専用カテゴリーの一覧を出力しようとすると所属記事はあるのに、出力されないという問題に直面。
管理画面で専用のカスタムタクソノミー(カテゴリー)を選択して表示してみると、表示先で適用されているファイルは「カテゴリーページ(category.php)」ではなく、「アーカイブページ (archive.php)」になっていた。
ということで、アーカイブページで一覧を表示する為に必要な情報の取得から調べてみることにしました。
カスタムタクソノミーの設置、および作成方法
カスタムタクソノミー自体のページ(カテゴリー、アーカイブページ)での取得方法。
個別ページ(singleページ)での所属タクソノミーの取得方法
最初にカスタムタクソノミーの作成方法から
記述場所はテーマフォルダの直下にあるfunctions.phpに下記の内容を追加します。
アクション名と利用する投稿タイプ、分類名などは任意のものに変更してください。
function my_custom_cat_type() {
register_taxonomy(
'test_category', //カスタム分類名
array('post','items'), //カスタム分類を利用する投稿タイプ
array(
'label' => 'テストカテゴリー',
'labels' => array(
'popular_items' => 'よく使うテストカテゴリー',
'edit_item' => 'テストカテゴリーを編集',
'add_new_item' => '新規テストカテゴリーを追加',
'search_items' => 'テストカテゴリーを検索',
),
'public' => true,
'hierarchical' => true //カテゴリーのような親子関係(階層)を持たせる
)
);
}
add_action( 'init', 'my_custom_cat_type', 0 );
今回カスタムタクソノミーを利用するポストタイプは「投稿(post)」と「商品(items)」です。
これで「投稿(post)」と「商品(items)」に専用カテゴリー(カスタムタクソノミー)を設置することができました。
次にカスタムタクソノミー自体のページです。
出力に必要な情報は主に、カテゴリースラッグ(タクソノミーのスラッグ)、又はカテゴリーID(タクソノミーのID)です。
なのでその情報の取得から。
必要なものは下記コードだけです。
まずは取得方法から
タームID(タクソノミー又はカスタム投稿専用カテゴリーID)取得
<?php get_queried_object_id();?>
ターム名(タクソノミー又はカスタム投稿専用カテゴリー名)取得
<?php single_term_title('', false); ?>
スラッグ取得
<?php
$tax_slug = $wp_query->get_queried_object();
$tax_slug2= esc_html($tax_slug->slug);
?>
これを使って出力で確認
<p>タームID:<?php $tax_id=get_queried_object_id();echo $tax_id;?></p>
<p>ターム名:<?php $tax_name = single_term_title('', false); echo $tax_name;?></p>
<p>スラッグ名:<?php $tax_slug= $wp_query->get_queried_object(); echo esc_html($tax_slug->slug);?></p>
確認が出来たら一覧出力コードに練り込む
・・・前に通常の場合(最初からあるcategoryを利用した場合)から説明
前提条件
・投稿タイプ(post_type)は「投稿(post)」
・カテゴリー(category)は「商品(item)」と「スタッフ(staff)」
・カテゴリーIDは商品が「10」でスタッフが「20」
タイトルのみ出力
この条件で一覧出力する場合
<?php
$paged = get_query_var('paged');
$args = array(
'paged' =>$paged,
'posts_per_page' => 5,
'post_type' => array('post'),
'category'=>'10,20',
);
?>
<?php $mypost = get_posts($args); ?>
<?php if($mypost):?>
<ul>
<?php foreach ( $mypost as $post ) : setup_postdata( $post ); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li>
<?php endforeach; wp_reset_postdata(); ?>
</ul>
<?php endif;?>
今回の条件
前提条件
投稿タイプ(post_type)はカスタム投稿
カスタム投稿は2種類
・「テスト一覧(testlist)」と「テスト一覧2(testlist2)」
カテゴリーは分類(タクソノミー)で作成
・分類(カテゴリー)は「テストカテゴリー(test_category)」
・呼ぶ出すカテゴリーはテストカテゴリー(test_category)属性の「商品(item)」と「スタッフ(staff)」
カテゴリーIDは商品が「10」でスタッフが「20」ですが、なくてもスラッグのみで呼び出せるので今回は使用しない
タイトルのみ出力
上記条件で出力
<?php
$paged = get_query_var('paged');
$args = array(
'paged' =>$paged,
'posts_per_page' => 5,
//'post_type' => array('post'),
'post_type' => array('testlist','testlist2'),
//'category'=>'10,20',
'test_category'=>array('item','staff')
);
?>
<?php $mypost = get_posts($args); ?>
<?php if($mypost):?>
<ul>
<?php foreach ( $mypost as $post ) : setup_postdata( $post ); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li>
<?php endforeach; wp_reset_postdata(); ?>
</ul>
<?php endif;?>
以上で、分類(カスタムタクソノミー)を使用した一覧出力の方法となります。
あとは応用で、一番最初に取得した情報を元に変数として格納し、上記コードを改変してアーカイブページを作成します。
時間が出来たらそのコードを追記します。
ここからシングルページでの取得方法
<?php $tarms = get_the_terms( $post -> ID ,'【引き出したいタクソノミーのスラッグ名】' ); ?>
<?php foreach ( $tarms as $tarm ):?>
<?php echo $tarm -> name;?>
<?php endforeach;?>
<!-- 特定の親カテゴリーに所属する子カテゴリーの取得と出力 -->
<?php $tarms = get_the_terms( $post -> ID ,'【引き出したいタクソノミーのスラッグ名】' ); ?>
<?php foreach ( $tarms as $tarm ):?>
<?php if($tarm->parent==【親タクソノミーのID】):?>
<?php echo $tarm -> name;?>
<?php endif;?>
<?php endforeach;?>
(例)
引き出したいタクソノミー(カスタムタクソノミー)はテストカテゴリー(スラッグ名:「test_category」)
親はスタッフ(親のスラッグ名:「staff」、親のID:「10」)
呼び出したい子カテゴリー(ターム)の階層
test_category
–staff
—-staff-name
—-staff-age
この条件で呼び出したい。
以下コード
<?php $tarms = get_the_terms( $post -> ID ,'test_category' ); ?>
<?php foreach ( $tarms as $tarm ):?>
<?php if($tarm->parent==10):?>
<?php echo $tarm -> name;?>
<?php endif;?>
<?php endforeach;?>
以下追記
一覧表示コード
<?php
$paged = get_query_var('paged');
$tax_slug = $wp_query->get_queried_object();
$tax_slug2= esc_html($tax_slug->slug);
$args = array(
'paged' =>$paged,
'posts_per_page' => 5,
//'post_type' => array('post'),
'post_type' => array('testlist','testlist2'),
//'category'=>'10,20',
'test_category'=>array('$tax_slug2'),
);
?>
<?php $mypost = get_posts($args); ?>
<?php if($mypost):?>
<ul>
<?php foreach ( $mypost as $post ) : setup_postdata( $post ); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li>
<?php endforeach; wp_reset_postdata(); ?>
</ul>
<?php endif;?>