カスタム分類名(スラッグ)は内部処理で使用されるため、「分類対象の投稿タイプ名」を利用して一定のルールで名前を付けると、内部処理が楽になる。
例えばカテゴリータイプの場合は「カスタム投稿タイプ名_cat」、タグタイプの場合は「カスタム投稿タイプ名_tag」と付けておけば、$postcat = get_post_type() .’_cat’ や $posttag= get_post_type(). ‘_tag’ のようにして使える。
register_taxonomy 関数は、register_post_type 関数と同様、WordPress の初期化時に実行される。
カスタム投稿をカスタム分類で分ける場合、まず、register_post_type 関数を実行して、その後に register_taxonomy 関数を実行する。
function 関数名() {
  register_post_type(カスタム投稿タイプ名, パラメータの配列);
  register_taxonomy(カスタム分類名 ,投稿タイプ名, パラメータの配列);
  flush_rewrite_rules();  
}
add_action('init', 関数名);
$args = array(//パラメータの配列
  'label' => 'ニュースカテゴリー',
  'labels' => array(
    'popular_items' => 'よく使うニュースカテゴリー',
    'edit_item' =>'ニュースカテゴリーを編集',
    'add_new_item' => '新規ニュースカテゴリーを追加',
    'search_items' => 'ニュースカテゴリーを検索',
  ),
  'public' => true,
  'hierarchical' => true  //カテゴリーのような親子関係(階層)を持たせる
);
register_taxonomy( 'news_cat', 'news', $args); 
//register_taxonomy(カスタム分類名 ,投稿タイプ名, パラメータの配列); 
function new_post_type() {
  //news(ニュース)というカスタム投稿タイプを登録
  register_post_type(
    'news',//投稿タイプ名(識別子)
    array(
      'label' => 'ニュース',  //カスタム投稿タイプの名前(これが管理画面のメニューに表示される)
      'labels' => array(  //管理画面に表示されるラベルを指定
        'add_new_item' => '新規ニュースを追加',
        'edit_item' =>'ニュースの編集',
        'view_item' =>  'ニュースを表示',
        'search_items' => 'ニュースを検索',
        'not_found' => 'ニュースは見つかりませんでした。',
        'not_found_in_trash' => 'ゴミ箱にニュースはありませんでした。',
      ),
      'public' => true,// 管理画面に表示しサイト上にも表示する
      'hierarchicla' => false,//コンテンツを階層構造にするかどうか(投稿記事と同様に時系列に)
      'has_archive' => true,//trueにすると投稿した記事の一覧ページを作成
      'supports' => array(//記事編集画面に表示する項目を配列で指定することができる
        'title',//タイトル
        'editor',//本文(の編集機能)
        'thumbnail',//アイキャッチ画像
        'excerpt'//抜粋
      ),
      'menu_position' => 5//「投稿」の下に追加
    )
  );
  //news_cat(ニュースカテゴリー)というカスタム分類を登録
  register_taxonomy(
    'news_cat',  //カスタム分類名
    'news',  //カスタム分類を利用する投稿タイプ
    array(
      'label' =>  'ニュースカテゴリー',  //管理画面ラベル名
      'labels' => array(
        'popular_items' =>  'よく使うニュースカテゴリー',
        'edit_item' => 'ニュースカテゴリーを編集',
        'add_new_item' => '新規ニュースカテゴリーを追加',
        'search_items' =>  'ニュースカテゴリーを検索',
      ),
      'public' => true,
      'hierarchical' => true  //カテゴリーのような親子関係(階層)を持たせる
    )
  );
  //news_tag(ニュースタグ)というカスタム分類を登録
  register_taxonomy(
    'news_tag',  //カスタム分類名
    'news',  //カスタム分類を利用する投稿タイプ
    array(
      'label' =>  'ニュースタグ',  //管理画面ラベル名
      'labels' => array(
        'popular_items' =>  'よく使うニュースタグ',
        'edit_item' => 'ニュースタグを編集',
        'add_new_item' => '新規ニュースタグを追加',
        'search_items' =>  'ニュースタグを検索',
      ),
      'public' => true,
      'hierarchical' => false  //タグ形式なので親子関係(階層)を持たせない
    )
  );
  flush_rewrite_rules();
}
add_action('init', 'new_post_type');
独自のタクソノミー(カスタムタクソノミー)は、標準で用意された投稿や固定ページにも追加することができる。
投稿記事に「ニュースの分類」というタクソノミーを追加するには、「タクソノミーを利用する投稿タイプ」を「post」と指定し、以下のように記述すると「投稿」のメニューにカテゴリーとは別に「ニュースの分類」というタクソノミーが追加される。
register_taxonomy(
  'news_cat',
  'post',
  array(
    'label' => 'ニュースの分類',
    'hierarchical' =>true
  )
);
カスタム分類のアーカイブページを出力する際は、以下のテンプレート階層に沿って、テンプレートが選ばれる。
関連ページ:カスタム投稿タイプの一覧ページの作成
例:「area」という投稿を地域で分類するカスタム分類があり、個々の投稿が属する地域を、先頭に「地域:」を出力し、地域名の間をコンマで区切って出力する場合
<?php echo get_the_term_list($post->ID, 'area', '地域:', ', ' , ''); ?>
投稿記事が特定のターム(カテゴリー、タグ、カスタム分類の個々の項目)に属しているかどうかを判断する。
//カスタム分類「news_cat」に属しているかどうか
<?php if(has_term('','news_cat')): ?>
//カスタム分類「news_cat」の「international」に属しているかどうか
<?php if(has_term('international','news_cat')): ?>
カスタム投稿「event」にカスタム分類「eventinfo」を登録してある場合の例。
(カスタム投稿タイプとカスタム分類が1対1の場合)
$post_types = get_taxonomy( 'eventinfo' )->object_type; echo $post_types[0]; // event が出力される。
反対に、カスタム投稿名からカスタム分類のスラッグを取得するには、
$taxes = get_object_taxonomies( 'event' ); echo $taxes[0]; //eventinfo が出力される。
前提:
カスタムタクソノミーで作成したカテゴリーやタグのスラッグ(カスタム分類名)の値は「カスタム投稿タイプのスラッグ_cat」、「カスタム投稿タイプのスラッグ_tag」という形で登録してある。
<?php
$postcat = get_post_type() . '_cat';
$posttag = get_post_type() . '_tag';
?>
//カテゴリータイプのものは「CATEGORY:」と表示して、カンマで区切って出力
<?php echo get_the_term_list($post->ID, $postcat, 'CATEGORY:', ', '); ?> 
//カテゴリータイプとタグタイプの両方がある場合のみに、間の区切り文字「|」を出力 
<?php if(has_term('', $postcat) && has_term('', $posttag)): ?> |   
<?php endif; ?>
//タグタイプのものは「TAG:」と表示して、カンマで区切って出力
<?php echo get_the_term_list($post->ID, $posttag, ' TAG:', ', '); ?> 
<?php if(is_tax()): ?> <h2><?php single_term_title( ); ?></h2> //表示中のページのカテゴリー名を出力 <?php endif; ?>
カスタム分類のアーカイブページを出力しているかどうかを判断する(is_tax)
taxonomy.php など(カテゴリーアーカイブページ、投稿タグアーカイブページ、その他のタクソノミーアーカイブページ)でタイトルを表示するのに使用できる。
カスタムタクソノミーで作成したタクソノミーをカテゴリー形式(’hierarchical’ => true)とタグ形式(’hierarchical’ => false)で条件分岐するには「is_taxonomy_hierarchical()」を利用する。
アーカイブページ(archive.php)でカスタム分類のページの場合「if(is_tax())」、それがカテゴリー形式である場合、「カテゴリー」と出力し、タグ形式の場合「タグ」と出力する例。
<div id="content"> <?php if(is_tax()): ?> <p id="archivetitle"> <span> <?php if(is_taxonomy_hierarchical($taxonomy)): ?> カテゴリー <?php else: ?> タグ <?php endif; ?> </span> <?php single_term_title(); ?> </p> <?php endif; ?>
カスタムタクソノミーのアーカイブページでは変数「$taxonomy」に表示中のページのタクソノミー名が入っているのでパラメータを「$taxonomy」と指定することができる。
カテゴリー別ページのカテゴリー名(ターム)と説明を表示するには、get_term_by() を利用して、表示中のページのカテゴリーに関するデータを $catinfo に取得して、そのメンバー変数(プロパティ)を使って出力する。
//表示中のページのタームオブジェクトを取得
<?php $catinfo = get_term_by('slug', $term, $taxonomy); ?>
  
//表示中のページのカテゴリー名(ターム)を出力
<h2><?php echo $catinfo->name; ?></h2> 
//表示中のページのカテゴリー名(ターム)の説明を出力 
<p><?php echo $catinfo->description; ?></p>  
taxonomy.php で生成されるカテゴリー別ページでは、表示中のタームのスラッグが変数 $term に、タームを管理しているタクソノミーの名前が変数 $taxonomy に入るので、get_term_by(‘slug’, $term, $taxonomy) と指定すれば、表示中のタームに関するデータを取得することができる。
get_terms() 関数を使って以下のように記述しても表示中のページのカテゴリー名を出力できる。
<?php $terms = get_terms($taxonomy,array('slug' => $term)); ?>
<h2><?php echo $terms[0]->name; ?></h2>  //表示中のページのカテゴリー名を出力
カテゴリー名だけを出力する場合、1番簡単な方法は single_term_title( ) を使う。
<h2><?php single_term_title( ); ?></h2> //表示中のページのカテゴリー名を出力
<?php wp_list_categories(array('taxonomy' => 'news')); ?>
カスタム投稿のリストは「wp_list_categories()」または「wp_tag_cloud()」を利用する
前提:カスタムタクソノミーで作成したカテゴリーやタグのスラッグ(カスタム分類名)の値を「カスタム投稿タイプのスラッグ_cat」、「カスタム投稿タイプのスラッグ_tag」という形で登録してある。
カテゴリータイプの場合(hierarchical: true)
「wp_list_categories()」の「taxonomy」パラメータを「get_post_type() .’_cat’ 」と指定する。
<ul id="menu"> <?php $args = array( 'taxonomy' => get_post_type(). '_cat', 'title_li' => '<h2>カテゴリー</h2>' ); ?> <?php wp_list_categories($args); ?> </ul>
タグタイプの場合(hierarchical: false)
「wp_tag_cloud()」の「taxonomy」パラメータを「get_post_type() .’_tag’ 」と指定する。
<ul id="menu"> <?php $args = array( 'taxonomy' => get_post_type(). '_tag', ); ?> <?php wp_tag_cloud($args); ?> </ul>
例:(但し、これだけなら wp_list_categories(array(‘taxonomy’ => ‘news’));で同じ結果が得られる)
<ul>
<?php $mycats = get_terms('news'); ?> 
<?php foreach($mycats as $mycat): ?>
<li>
<a href="<?php echo esc_url(get_term_link($mycat -> slug, $mycat -> taxonomy)); ?>">
<?php echo esc_html($mycat -> name); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
前述のリストの出力に、そのカテゴリーの属する記事の情報を取得してアイキャッチ画像を表示。
<ul>
<?php $mycats = get_terms('news'); ?>
<?php foreach($mycats as $mycat): ?>
<li>
<a href="<?php echo esc_url(get_term_link($mycat -> slug, $mycat -> taxonomy)); ?>">
<?php echo esc_html($mycat -> name); ?>
<br />
<?php $args = array(
  'tax_query' => array(
  array(
    'taxonomy' => $mycat -> taxonomy,
    'field' => 'slug',
    'terms' => $mycat -> slug
    )
  ),
  'posts_per_page' => 1
);
?>
<?php $my_query = new WP_Query($args); ?>
<?php if($my_query -> have_posts()): while($my_query -> have_posts()):$my_query -> the_post(); ?>
<?php the_post_thumbnail(); ?>
<?php endwhile; endif; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
WP_Query() の tax_query パラメータを使わず、以下のように「taxonomy」パラメータと「カスタムタクソノミー名」パラメータを使っても同じ。
$args = array( 'taxonomy' => $mycat -> taxonomy, $mycat -> taxonomy => $mycat -> slug, 'posts_per_page' => 1 )
タクソノミー(分類)には大きく分けて「ビルトイン分類」と「カスタム分類」がある。
タームは、タクソノミーの個々の分類項目のこと。
「category」 で「ニュース」や「フォト」などのカテゴリーを追加した場合、「category」はタクソノミー名で、 個々の「ニュース」や「フォト」がターム。
「interior_cat」というカスタムタクソノミーを作成して、その項目(カテゴリーまたはタグ)として「desk」や「table」を追加した場合、「interior_cat」はタクソノミー名で、「desk」や「table」がターム。
ここでややこしいというか混乱しやすいのは、「category」 の個々のカテゴリーの「ニュース」などのオブジェクトを「カテゴリーオブジェクト」というが、「カテゴリーオブジェクト」は taxonomy が category のタームオブジェクトであるということ。
「category」や「カスタム分類」のオブジェクトは「タクソノミーオブジェクト」。