WordPressサイトで扱うコンテンツが増えてくると、標準の「カテゴリー」や「タグ」だけでは分類しきれなくなることがあります。そんな時、独自の分類軸を作成できるのが「カスタムタクソノミー」です。例えば、書籍サイトなら「著者」「出版社」「ジャンル」、不動産サイトなら「エリア」「物件種別」「築年数」といった独自の分類方法を定義できます。これを実現するのがregister_taxonomy()
関数です。
register_taxonomy()
関数には多くのパラメータがあり、これらを理解することでカスタムタクソノミーの振る舞いや管理画面での表示、フロントエンドでの利用方法などを細かく制御できます。この記事では、その主要なパラメータをチートシート形式で徹底解説します。
register_taxonomy()
の基本的な使い方
カスタムタクソノミーは、カスタム投稿タイプと同様に、通常テーマのfunctions.php
またはプラグインファイル内で、init
アクションフックに掛けて登録します。これは、関連付ける投稿タイプが登録された後、かつ他の多くの処理が始まる前に実行されるため、最適なタイミングです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php function my_custom_taxonomies_init() { // カスタム投稿タイプ「書籍 (book)」に関連付けるカスタムタクソノミー「ジャンル (genre)」を登録する例 $args = array( 'public' => true, // 一般に公開するかどうか 'hierarchical' => true, // 階層構造を持つか (カテゴリーのような親子関係) 'label' => 'ジャンル', // 管理画面メニューなどに表示される名前 'rewrite' => array( 'slug' => 'book-genre' ), // パーマリンクのスラッグ 'show_in_rest' => true, // REST API およびブロックエディタ対応 // 他にも多くのパラメータがあります ); // register_taxonomy( 'タクソノミースラッグ', '関連付ける投稿タイプスラッグ(単数または配列)', $args ); register_taxonomy( 'genre', array( 'book' ), $args ); // 複数のカスタムタクソノミーを登録する場合は、ここに追加で register_taxonomy() を記述 } add_action( 'init', 'my_custom_taxonomies_init' ); ?> |
第一引数にはユニークなタクソノミースラッグ(半角英数字とアンダースコア、ハイフンのみ、32文字以内推奨)、第二引数にはこのタクソノミーを関連付ける投稿タイプスラッグ(単数または配列)、第三引数には設定オプションを連想配列で渡します。
register_taxonomy()
で使用できる主要なパラメータ一覧
register_taxonomy()
の第三引数$args
で使用できる主要なパラメータを機能別に分類しました。各パラメータの説明の冒頭には、その利用頻度や重要度を星の5段階評価で示しています。星の数の目安は以下の通りです。
★★★★★:ほぼ全ての開発で頻繁に利用され、基本かつ非常に重要なパラメータ
★★★★☆:高頻度で利用され、多くの一般的なカスタマイズで役立つ重要なパラメータ
★★★☆☆:中程度の頻度で利用され、特定の機能を実現する際に便利なパラメータ
★★☆☆☆:利用頻度はやや低めですが、特定の要件や細かな制御を行いたい場合に役立つパラメータ
★☆☆☆☆:利用頻度は低く、非常に限定的な状況や高度なカスタマイズでのみ使用されるパラメータ
パラメータ名 | 説明 (重要度/利用頻度) | 型 | デフォルト値 | 設定例 / 備考 |
---|---|---|---|---|
label |
★★★★★ タクソノミーの単数形の名前。 labels 配列が未設定の場合、他の表示名もこれから自動生成されます。 |
string |
$taxonomy の値 |
'ジャンル' , '著者' |
labels |
★★★★★ 管理画面やテーマ内で表示される、このタクソノミーに関する様々なテキストラベルを指定する配列。詳細は後述。 |
array |
label から自動生成 |
下記「labels パラメータの詳細」参照 |
description |
★★★☆☆ タクソノミーの説明文。管理画面などで表示されることがあります。 |
string |
'' (空文字列) |
'書籍のジャンルを分類します。' |
public |
★★★★★ このタクソノミーを一般に公開し、管理画面UIやフロントエンドでの表示を制御する包括的なスイッチ。 true にすると多くの関連パラメータ (show_ui , publicly_queryable など) が自動的にtrue になります。 |
boolean |
true |
true , false |
publicly_queryable |
★★★★☆ フロントエンドでこのタクソノミーのクエリ(例: example.com/?genre=action やパーマリンク経由)を許可するかどうか。public がtrue の場合のデフォルトはpublic の値。 |
boolean |
public の値 |
true , false |
hierarchical |
★★★★★ タクソノミーを階層構造(親子関係)にするかどうか。カテゴリーのように振る舞わせたい場合は true 、タグのようにフラットな構造にしたい場合はfalse 。 |
boolean |
false |
true (カテゴリー型), false (タグ型) |
show_ui |
★★★★☆ 管理画面のUI(投稿編集画面の選択ボックス、タクソノミー管理ページなど)を表示するかどうか。 |
boolean |
public の値 |
true , false |
show_in_menu |
★★★☆☆ 管理画面の関連投稿タイプのサブメニューとして、このタクソノミーの管理ページへのリンクを表示するか。 show_ui がtrue の場合に有効。 |
boolean |
show_ui の値 |
true , false |
show_in_nav_menus |
★★★★☆ 「外観」>「メニュー」で、このタクソノミーのタームをナビゲーションメニュー項目として選択可能にするか。 |
boolean |
public の値 |
true , false |
show_tagcloud |
★★★☆☆ タグクラウドウィジェットにこのタクソノミーのタームを表示するかどうか。通常、 hierarchical がfalse (タグ型)の場合に意味があります。 |
boolean |
show_ui の値 |
true , false |
show_in_quick_edit |
★★★★☆ 関連付けられた投稿タイプの一覧画面の「クイック編集」に、このタクソノミーのターム選択UIを表示するかどうか。 |
boolean |
show_ui の値(WP 4.2以降) |
true , false |
show_admin_column |
★★★★☆ 関連付けられた投稿タイプの一覧画面に、このタクソノミーのタームを表示するカラムを追加するかどうか。ソート可能にもなります。 |
boolean |
false |
true , false |
show_in_rest |
★★★★★ このタクソノミーをWordPress REST APIで利用可能にするかどうか。ブロックエディタのターム選択パネルなどで必要です。 |
boolean |
false |
true , false |
rest_base |
★★★☆☆ REST APIのエンドポイントとなるスラッグ。デフォルトはタクソノミースラッグ。 |
string |
$taxonomy |
'book-genres' |
rest_controller_class |
★★☆☆☆ REST APIのカスタムコントローラクラスを指定。 |
string |
'WP_REST_Terms_Controller' |
'My_Custom_Terms_Controller' |
rewrite |
★★★★☆ パーマリンクの書き換えルールを設定します。配列で詳細な設定(スラッグ、階層構造の反映など)が可能です。 false にすると書き換えルールを無効化。 |
boolean or array |
true (タクソノミースラッグを使用) |
array( |
query_var |
★★★★☆ フロントエンドのURLクエリ変数としてこのタクソノミーを使用可能にするか、またその変数名を指定します。 true の場合はタクソノミースラッグが使われます。文字列で任意の変数名を指定することも可能。false で無効化。 |
boolean or string |
$taxonomy (タクソノミースラッグ) |
true , false , 'book_genre_filter' |
capabilities |
★★☆☆☆ このタクソノミーを管理するための各権限( manage_terms , edit_terms , delete_terms , assign_terms )を詳細に指定します。通常は自動生成されるもので十分です。 |
array |
(自動生成) | (特定の権限をカスタマイズする場合) |
default_term |
★★★☆☆ 投稿が最初に作成される際に、このタクソノミーのデフォルトタームを割り当てる設定。配列で名前、スラッグ、説明を指定。 |
array |
null |
array( |
sort |
★★☆☆☆ このタクソノミーのタームが投稿に割り当てられた際に、タームの順序を保存するかどうか。主に wp_get_object_terms() のorderby がterm_order の場合に影響。 |
boolean |
null |
true , false |
labels
パラメータの詳細
labels
パラメータは、管理画面の様々な場所で表示されるテキストをカスタマイズするための連想配列です。細かく設定することで、ユーザーにとって分かりやすい管理画面を提供できます。
キー | 説明 | 一般的な値の例 (タクソノミー「ジャンル」の場合) |
---|---|---|
name |
タクソノミーの複数形の名前。管理画面メニューなど。 | 'ジャンル' |
singular_name |
タクソノミーの単数形の名前。 | 'ジャンル' |
search_items |
ターム検索時のボタンテキストなど。 | 'ジャンルを検索' |
popular_items |
非階層型で「よく使われているものから選択」のタイトル。 | '人気のジャンル' |
all_items |
ターム一覧ページのタイトルなど「すべての◯◯」。 | 'すべてのジャンル' |
parent_item |
階層型で親タームを指定する際のラベル。 | '親ジャンル' |
parent_item_colon |
階層型で親タームを指定する際のラベル(コロン付き)。 | '親ジャンル:' |
edit_item |
ターム編集ページのタイトル。 | 'ジャンルを編集' |
view_item |
ターム表示ページのテキスト。 | 'ジャンルを表示' |
update_item |
ターム更新ボタンのテキスト。 | 'ジャンルを更新' |
add_new_item |
新規ターム追加ページのタイトル。 | '新しいジャンルを追加' |
new_item_name |
新規ターム名入力欄のラベル。 | '新しいジャンル名' |
separate_items_with_commas |
非階層型でターム入力欄の下に表示される説明文の一部。 | '各ジャンルをコンマで区切ってください' |
add_or_remove_items |
非階層型で、メタボックス内のターム追加/削除エリアのアクセシビリティ用テキスト。 | 'ジャンルの追加または削除' |
choose_from_most_used |
非階層型で、メタボックス内の「よく使われているものから選択」リンクのテキスト。 | 'よく使われているジャンルから選択' |
not_found |
タームが見つからなかった場合のメッセージ。 | 'ジャンルが見つかりませんでした。' |
no_terms |
投稿にタームが関連付けられていない場合のテキスト。 | 'ジャンルがありません' |
items_list_navigation |
ターム一覧テーブルのナビゲーションのaria-label。 | 'ジャンルリストナビゲーション' |
items_list |
ターム一覧テーブルのaria-label。 | 'ジャンルリスト' |
most_used_items |
(WP 5.2+) よく使われているターム。デフォルトはpopular_items 。 |
'よく使われているジャンル' |
back_to_items |
(WP 5.5+) ターム編集画面から一覧へ戻るリンクテキスト。 | 'ジャンル一覧へ戻る' |
サンプルコード: カスタム投稿タイプ「書籍」に複数のカスタムタクソノミーを登録
カスタム投稿タイプ「書籍(book)」に対して、階層型の「ジャンル(genre)」と非階層型(タグ型)の「著者(book_author)」を登録する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
<?php function my_book_taxonomies_init() { // 先にカスタム投稿タイプ「書籍」が登録されている前提 // (例: add_action( 'init', 'my_register_book_post_type' ); などで) // 1. カスタムタクソノミー「ジャンル (genre)」- 階層型 $genre_labels = array( 'name' => 'ジャンル', 'singular_name' => 'ジャンル', 'search_items' => 'ジャンルを検索', 'all_items' => 'すべてのジャンル', 'parent_item' => '親ジャンル', 'parent_item_colon' => '親ジャンル:', 'edit_item' => 'ジャンルを編集', 'update_item' => 'ジャンルを更新', 'add_new_item' => '新しいジャンルを追加', 'new_item_name' => '新しいジャンル名', 'menu_name' => 'ジャンル', ); $genre_args = array( 'labels' => $genre_labels, 'public' => true, 'hierarchical' => true, // 階層型 (カテゴリーのような親子関係) 'show_ui' => true, 'show_admin_column' => true, // 投稿一覧にカラム表示 'query_var' => true, // URLクエリ (example.com/?genre=slug) を有効に 'rewrite' => array( 'slug' => 'book-genre', 'hierarchical' => true ), // パーマリンク 'show_in_rest' => true, // REST API対応 ); register_taxonomy( 'genre', array( 'book' ), $genre_args ); // 'book'投稿タイプに関連付け // 2. カスタムタクソノミー「著者 (book_author)」- 非階層型 $author_labels = array( 'name' => '著者', 'singular_name' => '著者', 'search_items' => '著者を検索', 'popular_items' => '人気の著者', 'all_items' => 'すべての著者', 'edit_item' => '著者を編集', 'update_item' => '著者を更新', 'add_new_item' => '新しい著者を追加', 'new_item_name' => '新しい著者名', 'separate_items_with_commas' => '各著者をコンマで区切ってください', 'add_or_remove_items' => '著者の追加または削除', 'choose_from_most_used' => 'よく使われている著者から選択', 'menu_name' => '著者', ); $author_args = array( 'labels' => $author_labels, 'public' => true, 'hierarchical' => false, // 非階層型 (タグのようなフラットな関係) 'show_ui' => true, 'show_admin_column' => true, 'show_in_quick_edit'=> true, 'query_var' => true, 'rewrite' => array( 'slug' => 'book-author' ), 'show_in_rest' => true, ); register_taxonomy( 'book_author', array( 'book' ), $author_args ); // 'book'投稿タイプに関連付け } add_action( 'init', 'my_book_taxonomies_init' ); ?> |
よくある質問 (FAQ)
- Q1: カスタムタクソノミーを登録するアクションフックは、カスタム投稿タイプと同じ
init
で良いのですか? - A1: はい、
init
フックが最適です。カスタム投稿タイプとカスタムタクソノミーは密接に関連することが多いため、同じinit
フック内の関数で両方を登録するのが一般的です。ただし、タクソノミーを登録する際には、関連付ける投稿タイプが既に(同じinit
フックのより前の処理で、または別のinit
フックのコールバックで同じ優先度なら先に)登録されているか、WordPressの組み込み投稿タイプである必要があります。 - Q2: 登録したカスタムタクソノミーのアーカイブページ(例:
example.com/book-genre/mystery/
)が404エラーになります。 - A2: カスタムタクソノミーを新しく登録したり、
rewrite
パラメータを変更したりした後は、WordPressのリライトルールを更新する必要があります。管理画面の「設定」 > 「パーマリンク設定」を開き、何も変更せずに「変更を保存」ボタンをクリックしてください。これによりリライトルールが再生成され、多くの場合問題が解決します。また、関連付けた投稿タイプにhas_archive
が設定されているか、タクソノミーのpublicly_queryable
がtrue
になっているかも確認点です。 - Q3: 「階層型 (hierarchical)」とは具体的にどういうことですか? メリット・デメリットは?
- A3: 階層型(
'hierarchical' => true
)は、WordPressの標準「カテゴリー」のように、ターム(分類項目)間に親子関係を持たせることができる設定です。例えば、「文学」という親ジャンルの下に「小説」「詩」という子ジャンルを作成できます。管理画面ではチェックボックス形式で選択できます。
メリットは、構造的な分類が可能で、親子関係を辿ったナビゲーションなどが作りやすい点です。
デメリットは、タームの数が非常に多くなると管理が煩雑になる可能性がある点です。
非階層型('hierarchical' => false'
)は、標準「タグ」のようにフラットな関係で、親子関係はありません。管理画面ではテキスト入力フィールドで追加します。自由なキーワードで分類したい場合に適しています。
まとめ
register_taxonomy()
関数とそれに付随するパラメータ群は、WordPressサイトのコンテンツをより構造的かつ意味のある形で分類・整理するための強力なツールです。カスタム投稿タイプと組み合わせることで、WordPressの可能性は無限に広がります。この記事のチートシートが、あなたのサイト構築やプラグイン開発において、より柔軟でユーザーフレンドリーな分類機能を実現するための一助となれば幸いです。
私たちは、埼玉県川越市とその周辺地域でWordPressサイトの制作から高度なカスタマイズ、保守管理まで幅広くサポートしています。オンラインでの対応も得意としておりますので、全国どこからでも、WordPressに関する専門的なご相談をお寄せください。
もっとWordPressの技術を磨きたい、あるいは信頼できる技術パートナーをお探しでしたら、WordPress顧問エンジニアサービスをご検討くださいね。