べんりワザ・WordPressの投稿タイプと分類を増やす

カスタムタクソノミーの作り方(register_taxonomy)

「季節」「ブランド」など独自の分類を追加するカスタムタクソノミーの作り方。register_taxonomyのコピペ用コード、カテゴリ型とタグ型の違い、一覧テンプレートと404の直し方をまとめました。

「季節」「ブランド」「対応エリア」——投稿を独自の軸で分類するのがカスタムタクソノミーです。カテゴリやタグと同じ仕組みを、自分で好きな名前で追加できます。

function my_register_taxonomies() {
  register_taxonomy('season', ['shohin'], [
    'label'             => '季節',
    'public'            => true,
    'hierarchical'      => true,    // true=カテゴリ型 / false=タグ型
    'show_admin_column' => true,    // 管理画面の一覧に列を追加
    'show_in_rest'      => true,    // ブロックエディタで使う
  ]);
}
add_action('init', 'my_register_taxonomies');

第1引数がタクソノミー名、第2引数が紐づける投稿タイプ(配列で複数指定できます)。これだけで、商品の編集画面に「季節」の選択欄が追加されます。

べんりワザカスタム投稿タイプの作り方(register_post_type)先にカスタム投稿タイプを作りたいときはこちら

カテゴリ型とタグ型

hierarchicalの1行で、性格がまるごと変わります。

hierarchical: true(カテゴリ型)hierarchical: false(タグ型)
親子関係持てる持てない
編集画面チェックボックスで選ぶ自由入力で追加できる
向いている用途決まった分類(季節・エリア・業種)増えていくキーワード(素材・特徴)

「あらかじめ決めた選択肢から選ばせたい」ならカテゴリ型「書き手が自由に足せるようにしたい」ならタグ型。運用する人の動きで選びます。

引数の早見表

引数意味よく使う値
label / labels管理画面の表示名'季節'
publicサイトに表示するかtrue
hierarchical親子を持てるかtrue / false
show_admin_column記事一覧に列を出すかtrue
show_in_restブロックエディタ対応true
rewriteURLの形['slug' => 'season', 'with_front' => false]
show_in_nav_menusメニューに追加できるかtrue
meta_box_cb入力欄の見た目を変えるfalseで欄を隠す
query_varURLパラメータで絞りこめるかtrue

一覧ページとテンプレート

タクソノミーを登録すると、タームごとの一覧ページが自動でできます。

/season/winter/     ← 「冬」に属する投稿の一覧

このページを担当するテンプレートは、次の順で探されます。

  1. taxonomy-season-winter.php(特定のタームだけ)
  2. taxonomy-season.php(そのタクソノミー全体)
  3. taxonomy.php
  4. archive.php
  5. index.php

専用ファイルを作らなくてもarchive.phpが代用するので、まず動く状態を確認してから必要に応じて作り足します。

タームの名前や説明は、テンプレートでこう出せます。

<h1><?php single_term_title(); ?></h1>
<?php if ($desc = term_description()) : ?>
  <div class="term-desc"><?php echo wp_kses_post($desc); ?></div>
<?php endif; ?>
べんりワザテンプレート階層早見表(どのファイルが使われる?)テンプレート階層の全体像はこちらの早見表で

記事にタームを表示する

その投稿に付いているタームはget_the_terms()(HTMLごと出すならthe_terms())で出します。

<?php the_terms(get_the_ID(), 'season', '季節:', '、'); ?>

分類の一覧(絞りこみメニュー)を作りたいときはget_terms()です。

べんりワザget_termsでカテゴリ・タームの一覧を出すターム一覧の出し方・リンクの作り方はこちら

そのタームの投稿だけ取り出す

一覧を自分で組むときはtax_queryで絞りこみます。

$query = new WP_Query([
  'post_type' => 'shohin',
  'tax_query' => [
    ['taxonomy' => 'season', 'field' => 'slug', 'terms' => 'winter'],
  ],
]);
べんりワザtax_queryでカテゴリ・タクソノミーで絞りこむtax_queryの条件の書き方(AND/OR・複数分類)はこちら

タクソノミーとカスタムフィールドの使い分け

同じ「追加情報」でも、役割が違います。

  • タクソノミー——一覧を絞りこむ軸。専用の一覧ページとURLができ、絞りこみが速い
  • カスタムフィールド——その記事で表示する値。価格・サイズ・日付など

判断の目安は「そのデータで一覧を見たいか」。「冬の商品だけ見たい」ならタクソノミー、「価格を表示したいだけ」ならカスタムフィールドです。件数が増えたときの速さにも差が出ます。

べんりワザmeta_queryでカスタムフィールドで絞る・並べ替えるカスタムフィールドで絞りこむ場合の書き方と、速さの話はこちら

名前の決めかたと注意点

  • 半角小文字の英数字とアンダースコア32文字以内
  • category post_tag type author name date termsなどWordPressが使っている名前は避ける
  • 投稿タイプ名と同じ名前にしない(URLがぶつかる)

あとから投稿タイプに紐づける

すでにあるタクソノミーを別の投稿タイプでも使いたいときは、1行で追加できます。

add_action('init', function () {
  register_taxonomy_for_object_type('season', 'post');   // 投稿でも「季節」を使う
});

逆に標準のカテゴリ・タグをカスタム投稿タイプで使いたいときは、register_post_type()'taxonomies' => ['category', 'post_tag']が手軽です。

まとめ

  1. register_taxonomy('名前', ['投稿タイプ'], [...])initフックで実行するだけ
  2. hierarchicalでカテゴリ型(選ばせる)/タグ型(自由に足す)が決まる
  3. 一覧はtaxonomy-<名前>.phpが担当。無ければarchive.phpが代用する
  4. 一覧で絞りたい軸はタクソノミー、表示するだけの値はカスタムフィールド

分類を設計できるようになると、同じ記事データから何通りもの見せ方が作れます。

よくある質問

カスタムタクソノミーとカスタムフィールドはどう使い分けますか?
一覧を絞りこむ軸として使うならタクソノミー(専用の一覧ページとURLが作られ、検索も速い)、その記事の中で表示するだけの情報ならカスタムフィールドです。「季節で絞って見せたい」ならタクソノミー、「価格を表示したい」ならカスタムフィールドが向いています。
カテゴリ型とタグ型の違いは何ですか?
register_taxonomyの'hierarchical'がtrueならカテゴリ型(親子を持てる・チェックボックスで選ぶ)、falseならタグ型(親子なし・自由入力で追加できる)です。
タクソノミーの一覧ページが404になります
「設定」→「パーマリンク」を開いて「変更を保存」を押すとURLのルールが再生成されて直ります。'public' => trueが入っているかもあわせて確認してください。
投稿一覧の管理画面にタクソノミーの列を出したいです
'show_admin_column' => trueを指定すると、管理画面の記事一覧にその分類の列が追加されます。運用がぐっと楽になるので、基本的にオンにしておくのがおすすめです。