2026年5月20日

2026年5月20日

WordPressにカスタム分類(タクソノミー)を追加する方法

はじめに

WordPressのカスタムタクソノミー(分類)を追加するには register_taxonomy() を使います。カテゴリーのような階層あり、タグのような階層なしを選べ、カスタム投稿タイプと組み合わせることで柔軟なコンテンツ分類が実現します。

症状・原因

  • カスタム投稿タイプに専用のカテゴリーを追加したい
  • 投稿とは別の分類体系でコンテンツを管理したい
  • カスタムタクソノミーを追加したが管理画面に表示されない
  • テンプレートでカスタムタクソノミーを表示したい

解決手順

ステップ1:カスタムタクソノミーを登録する

// functions.php
add_action('init', function(): void {

    // 階層あり(カテゴリー型): news_category を news に紐付け
    register_taxonomy('news_category', ['news'], [
        'labels' => [
            'name'              => 'ニュースカテゴリー',
            'singular_name'     => 'ニュースカテゴリー',
            'add_new_item'      => '新しいカテゴリーを追加',
            'edit_item'         => 'カテゴリーを編集',
            'update_item'       => 'カテゴリーを更新',
            'search_items'      => 'カテゴリーを検索',
            'not_found'         => 'カテゴリーが見つかりません',
        ],
        'hierarchical'      => true,    // true = カテゴリー型 / false = タグ型
        'public'            => true,
        'show_in_rest'      => true,    // Gutenberg対応
        'show_admin_column' => true,    // 管理画面の一覧にカラムを追加
        'rewrite'           => ['slug' => 'news-cat', 'with_front' => false],
    ]);

    // 階層なし(タグ型): news_tag を news に紐付け
    register_taxonomy('news_tag', ['news'], [
        'labels' => [
            'name'          => 'ニュースタグ',
            'singular_name' => 'ニュースタグ',
            'add_new_item'  => '新しいタグを追加',
        ],
        'hierarchical' => false,
        'public'       => true,
        'show_in_rest' => true,
        'rewrite'      => ['slug' => 'news-tag'],
    ]);
});

ステップ2:既存投稿タイプにタクソノミーを追加する

// functions.php — 標準投稿に独自タクソノミーを追加
add_action('init', function(): void {
    register_taxonomy('area', ['post'], [
        'labels'       => ['name' => 'エリア', 'singular_name' => 'エリア'],
        'hierarchical' => true,
        'public'       => true,
        'show_in_rest' => true,
        'rewrite'      => ['slug' => 'area'],
    ]);

    // または既存タクソノミーを別の投稿タイプにも適用
    register_taxonomy_for_object_type('category', 'news');
});

ステップ3:WP-CLIでタームを管理する

# タームを作成
wp term create news_category "プレスリリース" --slug=press-release
wp term create news_category "イベント情報" --slug=event

# 子タームを作成(親IDを指定)
wp term create news_category "展示会" --slug=exhibition --parent=5

# 一覧表示
wp term list news_category --format=table

# タームを記事に設定
wp post term set 42 news_category press-release

# タームを削除
wp term delete news_category 10

ステップ4:テンプレートでタームを表示する

// 現在の投稿のタームを取得
$terms = get_the_terms(get_the_ID(), 'news_category');

if ($terms && !is_wp_error($terms)) {
    echo '<ul class="news-categories">';
    foreach ($terms as $term) {
        printf(
            '<li><a href="%s">%s</a></li>',
            esc_url(get_term_link($term)),
            esc_html($term->name)
        );
    }
    echo '</ul>';
}

// タクソノミーアーカイブページで現在のタームを取得
if (is_tax('news_category')) {
    $term = get_queried_object();
    echo '<h1>' . esc_html($term->name) . '</h1>';
    echo '<p>' . esc_html($term->description) . '</p>';
}

ステップ5:カスタムタクソノミーでクエリする

// WP_Query でタクソノミーを使ってフィルタリング
$query = new WP_Query([
    'post_type'  => 'news',
    'tax_query'  => [
        [
            'taxonomy' => 'news_category',
            'field'    => 'slug',           // id / slug / name / term_taxonomy_id
            'terms'    => 'press-release',
        ],
    ],
    'posts_per_page' => 10,
]);

// 複数タームをAND条件で
$query = new WP_Query([
    'post_type' => 'news',
    'tax_query' => [
        'relation' => 'AND',
        ['taxonomy' => 'news_category', 'field' => 'slug', 'terms' => 'event'],
        ['taxonomy' => 'news_tag',      'field' => 'slug', 'terms' => '2024'],
    ],
]);

注意事項

  • register_taxonomy()init アクション内で、register_post_type() の後に呼び出すか、同じアクション内でポストタイプの後に登録してください
  • show_in_rest => true を設定しないとGutenbergのサイドバーに表示されません
  • タクソノミーを追加・変更した後は wp rewrite flush --hard を実行してください
  • タクソノミーのスラッグはすでに使われているURLと衝突しないよう注意してください

まとめ

register_taxonomy() に投稿タイプ・階層設定・パーマリンクを指定してカスタムタクソノミーを登録します。hierarchical => true でカテゴリー型、false でタグ型になります。tax_query を使うとWP_Queryでタームによるフィルタリングが可能です。

お気軽にご相談ください

お見積りへ お問い合わせへ