カスタム分類名(スラッグ)は内部処理で使用されるため、「分類対象の投稿タイプ名」を利用して一定のルールで名前を付けると、内部処理が楽になる。
例えばカテゴリータイプの場合は「カスタム投稿タイプ名_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」や「カスタム分類」のオブジェクトは「タクソノミーオブジェクト」。