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