関数

register_taxonomy() を解説:WordPressでカスタム分類(タクソノミー)を登録する方法

WordPressでカスタム分類(タクソノミー)を登録する際に利用するregister_taxonomy()関数について解説します。

カスタム投稿タイプと連携させることで、管理画面で独自の分類メニューが表示され、パーマリンクやREST APIの設定も柔軟に行えます。

この記事では、具体的な実装例を交えながら、ラベル設定や階層構造など各種オプションの設定方法を分かりやすく説明します。

カスタム分類登録の基本

register_taxonomy()の役割と動作

関数の基本動作

WordPressでカスタム分類を追加するための代表的な関数であるregister_taxonomy()は、タクソノミー(分類)オブジェクトを作成し、指定した投稿タイプなどに付加する仕組みです。

内部では、与えられたラベルやオプションに沿ってWP_Taxonomyオブジェクトが生成され、リライトルールの追加やREST API対応などの後続処理も自動で行われます。

以下は基本的な使用例です。

<?php
// カスタム分類「sample_taxonomy」を投稿タイプ「post」に登録する例
function register_sample_taxonomy() {
    $labels = array(
        'name'              => 'サンプル分類',
        'singular_name'     => 'サンプル分類',
        'search_items'      => 'サンプル分類を検索',
        'all_items'         => 'すべてのサンプル分類',
        'edit_item'         => 'サンプル分類を編集',
        'update_item'       => 'サンプル分類を更新',
        'add_new_item'      => '新規サンプル分類を追加',
        'new_item_name'     => '新しいサンプル分類名',
        'menu_name'         => 'サンプル分類'
    );
    $args = array(
        'labels'            => $labels,
        'hierarchical'      => true, // 階層構造(カテゴリーのような振る舞い)
        'show_ui'           => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'sample-terms'),
        'show_in_rest'      => true  // REST API対応
    );
    register_taxonomy('sample_taxonomy', 'post', $args);
}
add_action('init', 'register_sample_taxonomy');
// 管理画面に「サンプル分類」のメニューが表示され、投稿編集画面でタクソノミーが利用できる状態になります。

投稿タイプとの連携方法

register_taxonomy()の第二引数で指定する投稿タイプ($object_type)は、1つの投稿タイプでも配列を用いて複数指定することも可能です。

たとえば、カスタム投稿タイプ「book」に対してタクソノミー「genre」を連携する場合、以下のようなコードになります。

<?php
// カスタム投稿タイプ「book」と連携するタクソノミー「genre」を登録する例
function register_book_genre() {
    $labels = array(
        'name'              => 'ジャンル',
        'singular_name'     => 'ジャンル',
        'search_items'      => 'ジャンルを検索',
        'all_items'         => 'すべてのジャンル',
        'edit_item'         => 'ジャンルを編集',
        'update_item'       => 'ジャンルを更新',
        'add_new_item'      => '新規ジャンルを追加',
        'new_item_name'     => '新しいジャンル名',
        'menu_name'         => 'ジャンル'
    );
    $args = array(
        'labels'            => $labels,
        'hierarchical'      => true,
        'show_ui'           => true,
        'query_var'         => true,
        // URLで「books/genre」と表示する設定
        'rewrite'           => array( 'slug' => 'books/genre', 'with_front' => false ),
        'show_in_rest'      => true
    );
    register_taxonomy( 'genre', 'book', $args );
}
add_action( 'init', 'register_book_genre' );
// 「book」投稿タイプの管理画面に「ジャンル」メニューが追加され、投稿編集画面にはカテゴリー選択用のチェックボックスが表示されます。

登録時の注意点

命名規則と予約語の制約

タクソノミー名($taxonomy)の命名にはいくつかの制約があります。

必ず小文字のアルファベット、数字、ハイフン(-)、アンダースコア(_)のみで構成し、32文字以内に収める必要があります。

WordPress内部の関数sanitize_key()が適用されるため、大文字などを含む名前は避けましょう。

また、post_tagcategoryなど、内部で既に利用されている予約語は使用しないよう注意が必要です。

ポイントは以下の通りです。

  • 小文字とアンダースコアで命名する(例:custom_tax)
  • 予約語や内部用語(例:post, pageなど)を避ける
  • 名前はシンプルでユニークなものにする

適切な登録タイミングのポイント

タクソノミーの登録は、WordPressの初期化処理が完了した後に実行する必要があります。

多くの場合、initフックを利用するのが一般的です。

これにより、カスタム投稿タイプやリライトルールの設定が整った状態でタクソノミーが登録され、想定通りの動作を実現できます。

以下はinitフックを用いた実装例です。

<?php
// initフック内でタクソノミーを登録する例
function my_register_taxonomy() {
    register_taxonomy( 'sample_tax', 'post', array(
        'labels'       => array( 'name' => 'サンプルタクソノミー' ),
        'hierarchical' => false,
        'rewrite'      => array( 'slug' => 'sample-tax' )
    ) );
}
add_action( 'init', 'my_register_taxonomy' );
// 正しいタイミングでタクソノミー「sample_tax」が登録され、管理画面およびフロントエンドに反映されます。

各種パラメータの詳細設定

ラベル設定

管理画面表示用ラベルの構成

タクソノミーのラベル設定は管理画面上での扱いを左右する重要な要素です。

設定するラベル項目には、一般名称name、単数形singular_name、検索用テキストsearch_itemsなどが含まれます。

これらは管理画面の各部分で表示され、編集作業の補助となります。

例えば、以下のような配列を用いることで、管理画面のメニューやターム編集画面で適切な表記が行われます。

<?php
$labels = array(
    'name'              => 'トピック',
    'singular_name'     => 'トピック',
    'search_items'      => 'トピックを検索',
    'all_items'         => 'すべてのトピック',
    'edit_item'         => 'トピックを編集',
    'update_item'       => 'トピックを更新',
    'add_new_item'      => '新規トピックを追加',
    'new_item_name'     => '新しいトピック名',
    'menu_name'         => 'トピック'
);

各操作テキストの設定例

各操作時のテキストもラベルとして指定することができます。

例えば、タクソノミー項目の編集や更新、追加時に表示されるテキストは、ユーザーにとってわかりやすい表現を選ぶことで管理画面の操作性が向上します。

上記の例のように、各キーに具体的な説明文を設定することで、管理者が直感的に操作できるインターフェースが実現されます。

オプション設定

階層構造の有無と設定方法

タクソノミーの振る舞いは、hierarchicalオプションで制御します。

  • trueに設定すると、カテゴリーのような階層構造となり、複数階層でのターム管理が可能です。チェックボックス形式のUIが用意されます。
  • falseに設定すると、タグのような平坦な構造となり、タームをテキスト入力や自動補完で追加するスタイルになります。
<?php
$args = array(
    'hierarchical' => true, // カテゴリー形式で階層化する場合
    'labels'       => $labels,
    'show_ui'      => true,
);
register_taxonomy( 'custom_category', 'post', $args );
// カテゴリ形式のタクソノミー「custom_category」が投稿画面に階層的なチェックボックスとして表示されます。

URLリライトの設定(slug, with_front)

URLリライト機能は、パーマリンクの整形に利用されます。

rewriteパラメータで設定するslugは、URLに現れる分類の識別子です。

また、with_frontパラメータにより、フロントのベース部分を付加するか否かを制御できます。

以下は例です。

<?php
$args = array(
    'rewrite' => array(
        'slug'       => 'custom-topic',   // URLに使われるスラッグ
        'with_front' => false             // フロントベースを除外
    ),
    'labels'  => $labels,
);
register_taxonomy( 'custom_topic', 'post', $args );
// URLが「https://example.com/custom-topic/」の形式でアクセス可能になります。

REST API対応の設定項目

カスタムタクソノミーをREST APIで扱えるようにする場合、show_in_restオプションをtrueに設定します。

さらに、場合によってはrest_baseを定義してエンドポイントを変更することも可能です。

<?php
$args = array(
    'show_in_rest' => true,         // REST API対応
    'rest_base'    => 'custom-topic', // エンドポイントのベース名の指定
    'labels'       => $labels,
);
register_taxonomy( 'custom_topic', 'post', $args );
// REST API経由で「custom_topic」が利用可能になり、エンドポイントは「/wp-json/wp/v2/custom-topic」となります。

デフォルトタームの設定

初期ターム自動生成の設定

タクソノミー登録時に初期タームを自動生成する設定を行うこともできます。

これにより、タクソノミーが初めて登録された際に、あらかじめ「未分類」などのタームが存在する状態を作ることができます。

以下はその設定例です。

<?php
function register_taxonomy_with_default() {
    $labels = array(
        'name' => 'トピック'
    );
    $args = array(
        'labels'       => $labels,
        'hierarchical' => false,
        // 初期タームの設定
        'default_term' => array(
            'name'        => '未分類',
            'slug'        => 'uncategorized',
            'description' => '初期状態のターム'
        )
    );
    register_taxonomy( 'topic', 'post', $args );
}
add_action( 'init', 'register_taxonomy_with_default' );
// タクソノミー「topic」が登録されると、自動的に「未分類」というタームが挿入されます。

wp_insert_term()の活用例

場合によっては、タクソノミー登録後に動的にタームを挿入する必要が生じることがあります。

wp_insert_term()を利用することで、条件に応じたターム作成を柔軟に行なえます。

以下は動作例です。

<?php
function insert_default_term() {
    // タクソノミー「topic」に対して「未分類」というタームが存在しなければ追加する
    if ( ! term_exists( 'uncategorized', 'topic' ) ) {
        wp_insert_term(
            '未分類',      // ターム名
            'topic',       // タクソノミー指定
            array(
                'slug'        => 'uncategorized',
                'description' => '初期状態のターム'
            )
        );
    }
}
add_action( 'init', 'insert_default_term' );
// 登録時に「topic」タクソノミーに新たに「未分類」タームが自動で作成されます(すでに存在する場合は作成されません)。

フック処理と登録後の対応

登録時フックの利用

initフックでの登録実装

タクソノミーの登録は、WordPressの全初期処理が済んだ後で行う必要があります。

initフックを利用することで、カスタム投稿タイプやその他のオプションが正しく設定された状態でタクソノミーを登録できます。

これは、テーマやプラグインの互換性を保つためにも重要なポイントです。

以下は基本的な実装例です。

<?php
// initフックでタクソノミーを登録
function my_custom_taxonomy() {
    $labels = array(
        'name'          => 'サンプル分類',
        'singular_name' => 'サンプル分類'
    );
    $args = array(
        'labels'        => $labels,
        'hierarchical'  => false,
        'rewrite'       => array( 'slug' => 'sample-tax' ),
        'show_in_rest'  => true
    );
    register_taxonomy( 'sample_tax', 'post', $args );
}
add_action( 'init', 'my_custom_taxonomy' );
// 「sample_tax」が正しいタイミングで登録され、管理画面に反映されます。

タクソノミー固有のフック処理

タクソノミーの登録が完了した直後に特定の処理を実行したい場合、registered_taxonomyや動的フックregistered_taxonomy_{taxonomy}を利用できます。

これにより、登録完了後にログ出力や追加設定が容易になります。

以下は動的フックの利用例です。

<?php
// タクソノミー「genre」専用のフック処理
function after_genre_registered( $taxonomy, $object_type, $args ) {
    error_log( "タクソノミー「{$taxonomy}」が登録されました。" );
}
add_action( 'registered_taxonomy_genre', 'after_genre_registered', 10, 3 );
// タクソノミー「genre」が登録されると、エラーログに登録完了のメッセージが出力されます。

登録後の追加処理

エラーログによる検証方法

タクソノミーの登録に伴い不具合が生じた場合、error_log()を活用してエラーログにメッセージを出力し、問題個所を特定する手法が有効です。

ログ出力により、引数のミスやフックのタイミングの誤りを迅速に把握できます。

以下はエラーログを利用した検証方法の例です。

<?php
function check_taxonomy_registration( $taxonomy, $object_type, $args ) {
    // 登録後の状態をログに記録する
    error_log( "Taxonomy {$taxonomy} has been registered for " . print_r( $object_type, true ) );
}
add_action( 'registered_taxonomy', 'check_taxonomy_registration', 10, 3 );
// 登録完了後、サーバーログにタクソノミーの情報が記録され、検証がしやすくなります。

登録完了後のアクション管理

タクソノミーが正しく登録された後に、別の設定や処理を実行する必要がある場合、適宜アクションフックを追加できます。

たとえば、カスタムタクソノミーの利用状況に応じた追加の設定や、キャッシュのクリアといった処理を行う場合に有効です。

次のコード例では、タクソノミー登録後に追加処理としてカスタム処理用の関数を実行する例を示します。

<?php
function taxonomy_post_register_action( $taxonomy, $object_type, $args ) {
    // 登録後の追加処理
    // 例: キャッシュクリアや他の設定の初期化
    error_log( "追加処理を実行:タクソノミー {$taxonomy} 登録完了" );
}
add_action( 'registered_taxonomy', 'taxonomy_post_register_action', 15, 3 );
// タクソノミー登録後に、追加処理として設定した処理が自動的に呼び出され、エラーログに記録されます。

まとめ

本記事では、WordPressにおけるカスタム分類登録の基本から、register_taxonomy()の動作、投稿タイプとの連携方法、命名規則や登録タイミングのポイントまでを学べます。

また、各種パラメータの詳細設定やオプション(ラベル設定、階層構造、URLリライト、REST API対応、初期ターム自動生成、wp_insert_term()の活用例)や、登録時フックと追加処理の仕組みを理解することで、スムーズなカスタム分類実装が可能になる内容です。

関連記事

Back to top button
目次へ