2026年10月21日

2026年10月21日

WordPressのカスタムタクソノミーを作成する方法

はじめに

カスタムタクソノミーは、WordPressの標準的なカテゴリーやタグ以外で独自の分類体系を構築する際に使用します。例えば、商品のブランドや製品ラインなどを細かく分類するために有効です。

症状・背景

このテーマが必要になる主な場面:

  • 商品サイトで複数の製品ライン分けを行いたい場合
  • ブログ記事を特定のジャンル別に分類したい場合
  • 複雑なデータモデルに対応するため、カスタムポストタイプと共に使用

手順・設定方法

ステップ1: カスタムタクソノミーを追加

# ファイルにカスタムタクソノミーの定義を追加します。通常、functions.phpかプラグインファイル内に記述します。
function custom_taxonomy() {
    register_taxonomy( 'genre', 'post', array(
        'label' => 'ジャンル',
        'rewrite' => array('slug' => 'genre'),
        'hierarchical' => true,
    ) );
}
add_action( 'init', 'custom_taxonomy' );

ステップ2: カスタムタクソノミーのオプション設定

# カスタムタクソノミーにパブリックなメタボックスを追加します。
function add_custom_genre_metabox() {
    add_meta_box(
        'custom-genre-metabox',
        __( 'ジャンル情報', 'textdomain' ),
        'display_custom_genre_metabox',
        'post',
        'normal',
        'high'
    );
}
add_action( 'add_meta_boxes', 'add_custom_genre_metabox' );

# メタボックスの表示関数
function display_custom_genre_metabox() {
    global $post;
    // 安全なデータを取得するための非同期GETリクエスト
    wp_nonce_field( basename( __FILE__ ), 'custom_genre_nonce' );
    
    // カスタムタクソノミーの値を取得し表示します。
    $genre = get_the_terms( $post->ID, 'genre' );
    
    echo '<label for="genre">';
    _e( 'ジャンル:', 'textdomain' );
    echo '</label> ';
    wp_dropdown_categories(array(
        'taxonomy' => 'genre',
        'name'     => 'genre',
        'selected' => $genre ? $genre[0]->term_id : '',
        'hide_empty' => false,
    ));
}

ステップ3: カスタムタクソノミーのデータ保存処理

# メタボックスから送信されたデータを保存します。
function save_custom_genre_metabox( $post_id ) {
    // アクションが非同期POSTリクエストであることを確認します。
    if ( !isset($_POST['custom_genre_nonce']) || !wp_verify_nonce($_POST['custom_genre_nonce'], basename(__FILE__)) )
        return;
    
    // 通常の投稿編集チェックをパスします。
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return;

    // 管理者以外からのリクエストは無視します。
    if ( !current_user_can( 'edit_post', $post_id ) )
        return;
    
    // ドロップダウンから選択されたタームIDを取得します。
    $genre = isset($_POST['genre']) ? $_POST['genre'] : '';
    
    // カスタムタクソノミーの値を保存します。
    wp_set_post_terms( $post_id, $genre, 'genre' );
}
add_action( 'save_post', 'save_custom_genre_metabox' );

ステップ4: アーカイブページのカスタマイズ

# カスタムタクソノミー用のアーカイブページを生成します。
function custom_taxonomy_rewrite_rules() {
    add_rewrite_rule( 'genre/(.+)/?', 'index.php?taxonomy=genre&term=$matches[1]', 'top' );
}
add_action( 'init', 'custom_taxonomy_rewrite_rules' );

# カスタムタクソノミーのアーカイブページテンプレートを指定します。
function custom_taxonomy_template_include( $template ) {
    if ( is_tax('genre') )
        return get_stylesheet_directory() . '/taxonomy-genre.php';
    
    return $template;
}
add_filter( 'template_include', 'custom_taxonomy_template_include' );

注意事項

  • カスタムタクソノミーの追加は、開発環境で試行錯誤を繰り返す前に必ず計画と設計を行うこと。
  • 必要な場合、カスタムフィールドやカスタムメタボックスも一緒に実装すること。
  • カスタムタクソノミーのURLスラッグは、SEO最適化に配慮した名称を使用すること。
  • フロントエンドでの表示や検索機能を改善するためには、適切なCSSとJavaScriptを使用すること。

まとめ

1. カスタムタクソノミーの追加: register_taxonomy()関数を使用し、必要に応じてメタボックスも実装します。

2. データ保存処理: メタボックスから送信されたデータを適切な形で保存するためのフックを作ります。

3. アーカイブページの設定: カスタムタクソノミー用のURLルールとテンプレートファイルを定義します。

4. 安全性: ノンセチェックやユーザー権限確認を適切に行い、データの不正な送信から保護します。

関連記事:

お気軽にご相談ください

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