カスタムタクソノミーをfunctions.phpで登録する方法【WordPress】

WordPress

こんにちは!コーダーのゆうしです。

WordPressのカスタム投稿タイプを使っていると「カテゴリーとは別に独自の分類を追加したい」という場面がよくあります。例えば不動産サイトなら「エリア」「物件種別」、採用サイトなら「雇用形態」「職種」といった分類です。これを実現するのがカスタムタクソノミーです。この記事では register_taxonomy() を使ってfunctions.phpにカスタムタクソノミーを登録する方法を解説します。

タクソノミーとは?

タクソノミーとは投稿を分類するための仕組みです。WordPressにはデフォルトで「カテゴリー」と「タグ」という2つのタクソノミーが用意されています。カスタムタクソノミーを使うことで、これらとは別に独自の分類を追加できます。

タクソノミーには2種類あります。

種類内容デフォルトの例
階層あり(カテゴリー型)親子関係を持てるカテゴリー
階層なし(タグ型)親子関係を持たないタグ

register_taxonomy()hierarchical パラメータで切り替えられます。

基本的な実装コード

functions.php に以下のコードを追加します。

add_action( 'init', 'register_custom_taxonomy' );
function register_custom_taxonomy() {
  $labels = [
    'name'          => 'エリア',
    'singular_name' => 'エリア',
    'search_items'  => 'エリアを検索',
    'all_items'     => 'すべてのエリア',
    'edit_item'     => 'エリアを編集',
    'update_item'   => 'エリアを更新',
    'add_new_item'  => '新しいエリアを追加',
    'new_item_name' => '新しいエリア名',
    'menu_name'     => 'エリア',
  ];

  $args = [
    'labels'            => $labels,
    'hierarchical'      => true,  // trueでカテゴリー型・falseでタグ型
    'show_ui'           => true,
    'show_admin_column' => true,
    'show_in_rest'      => true,  // Gutenberg対応
    'rewrite'           => [ 'slug' => 'area' ],
  ];

  register_taxonomy( 'area', 'property', $args );
  // register_taxonomy( 'タクソノミー名', '対象の投稿タイプ', $args );
}

'area' がタクソノミーのスラッグ、'property' が対象のカスタム投稿タイプのスラッグです。ご自身の環境に合わせて変更してください。

各パラメータの解説

パラメータ内容
labels管理画面に表示されるラベルの設定
hierarchicaltrue でカテゴリー型(親子関係あり)、false でタグ型
show_uitrue で管理画面にUIを表示する
show_admin_columntrue で投稿一覧にタクソノミーの列を表示する
show_in_resttrue でGutenbergエディタ・REST APIで使用できる
rewriteフロントエンドのURLのスラッグを指定する

複数の投稿タイプに紐付ける

1つのタクソノミーを複数の投稿タイプに紐付けたい場合は、第二引数を配列にします。

register_taxonomy( 'area', [ 'property', 'shop' ], $args );

この例では propertyshop の両方の投稿タイプで area タクソノミーを使えるようにしています。

カスタム投稿タイプと同時に登録する場合

カスタム投稿タイプと一緒に登録する場合は register_post_type()taxonomies パラメータに紐付けることもできます。

register_post_type( 'property', [
  // 他の設定...
  'taxonomies' => [ 'area', 'category' ],
]);

ただしこの方法では register_taxonomy() で別途タクソノミーを登録する必要があります。紐付けだけをここで指定するイメージです。

タームをテンプレートで出力する

登録したタクソノミーのタームをテンプレートファイルで出力するには get_the_terms() を使います。

<?php
$terms = get_the_terms( get_the_ID(), 'area' );
if ( $terms && ! is_wp_error( $terms ) ) :
  foreach ( $terms as $term ) :
?>
  <span class="area-label"><?php echo esc_html( $term->name ); ?></span>
<?php
  endforeach;
endif;
?>

get_the_terms() の第二引数にタクソノミーのスラッグを指定します。タームが複数ある場合はforeachで全て出力できます。

タクソノミーで絞り込んだ投稿を取得する

WP_Queryと tax_query を組み合わせることで、特定のタームの投稿だけを取得できます。

$args = [
  'post_type' => 'property',
  'tax_query' => [
    [
      'taxonomy' => 'area',      // タクソノミーのスラッグ
      'field'    => 'slug',      // termをslugで指定
      'terms'    => 'tokyo',     // 絞り込むタームのslug
    ],
  ],
];
$query = new WP_Query( $args );

field には slug の他に term_idname も指定できます。

躓きやすいポイント

管理画面にタクソノミーが表示されない

show_ui => true が設定されているか確認してください。また register_taxonomy() の第二引数に指定した投稿タイプが正しく登録されているかも確認してください。

パーマリンクが404になる

タクソノミーを登録したあとはパーマリンクの設定を一度保存し直してください。管理画面の「設定」→「パーマリンク」を開いて「変更を保存」ボタンを押すだけでOKです。

Gutenbergエディタにタクソノミーが表示されない

show_in_rest => true が設定されていないとGutenbergエディタに表示されません。Gutenbergを使っている場合は必ず指定してください。

既存のカテゴリーと混同される

カスタムタクソノミーのスラッグがWordPressの予約語(category tag post_tag など)と被っていると意図しない動作になります。ユニークなスラッグを使うようにしてください。

まとめ

register_taxonomy() を使うことで独自の分類軸をWordPressに追加できます。hierarchical で階層の有無・rewrite でURLのスラッグ・show_in_rest でGutenberg対応と、パラメータを組み合わせることで柔軟にカスタマイズできます。登録後はパーマリンクの再保存を忘れずに行ってください。

ご不明な点やコーディングのご依頼はお問い合わせからお気軽にどうぞ。

タイトルとURLをコピーしました