• TOP
  • 記事一覧
  • 【WordPress】プラグイン不使用でカスタムタクソノミーを設定、絞り込み検索について

【WordPress】プラグイン不使用でカスタムタクソノミーを設定、絞り込み検索について

更新日:2025/01/25

functions.phpでの設定方法

functions.php に以下のコードを追加することでカスタムタクソノミーを作成できます

function create_custom_taxonomy() {
    $labels = array(
        'name' => 'カテゴリー名',
        'singular_name' => '単数形のカテゴリー名',
        'menu_name' => 'メニューに表示される名前',
        'all_items' => 'すべての項目',
        'edit_item' => '編集',
        'view_item' => '表示',
        'update_item' => '更新',
        'add_new_item' => '新規追加',
        'search_items' => '検索'
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'hierarchical' => true, // falseにするとタグ形式
        'show_ui' => true,
        'show_admin_column' => true,
        'query_var' => true,
        'rewrite' => array('slug' => 'taxonomy-slug')
    );

    register_taxonomy(
        'taxonomy-name', // タクソノミーのスラッグ
        'post', // 投稿タイプ(post, pageなど)
        $args
    );
}
add_action('init', 'create_custom_taxonomy');
WordPress Theme functions.php Custom Taxonomy Terms – Term 1 – Term 2 – Term 3

register_taxonomy について

register_taxonomy の主要パラメータについて

register_taxonomy( 
    string $taxonomy, // タクソノミーの名前(必須)
    array|string $object_type, // 紐付ける投稿タイプ(必須)
    array $args // 設定オプション(任意)
);
1. register_taxonomy() 関数定義 2. タクソノミー名とオブジェクトタイプ指定 3. 各種オプション設定(hierarchical等)

$args の主要オプションの使用例と解説

$args = array(
    'hierarchical' => true,     // カテゴリー形式(false=タグ形式)
    'public' => true,          // 公開設定
    'show_in_rest' => true,    // ブロックエディタ対応
    'rewrite' => array(
        'slug' => 'custom-tax', // URLスラッグ
        'with_front' => true    // パーマリンク先頭部分の継承
    ),
    'show_admin_column' => true, // 投稿一覧にカラム表示
    'show_ui' => true,          // 管理画面での表示
    'query_var' => true         // クエリ変数としての使用可否
);
オプション デフォルト値 説明 hierarchical false 階層構造の有無(カテゴリー/タグ形式) public true 公開状態の設定 show_ui true 管理画面での表示有無 show_in_rest false ブロックエディタでの利用可否 rewrite true パーマリンク設定 show_admin_column false 投稿一覧での表示有無

カスタムタクソノミーを設定したfunctions.phpを含むテーマから別のテーマに変更した場合影響

データベースへの影響

  • タクソノミーのデータは完全に保持
  • 投稿との関連付けも維持
  • データの損失や破損のリスクなし

機能面での制限

  1. 管理画面での制限
    • タクソノミーの編集画面が非表示
    • 新規投稿時にタクソノミーの選択不可
  2. フロントエンド
    • タクソノミーに基づく表示・検索が機能しない
    • アーカイブページにアクセス不可
変更前 functions.php タクソノミー登録 表示・機能OK 変更後 新functions.php タクソノミー未登録 表示・機能制限

エラーについて

  • 致命的なエラーは発生しない
  • get_terms()などの関数は空の結果を返す
  • タクソノミーのアーカイブURLにアクセスすると404

テーマ変更時のタクソノミーデータは安全に保持されますが、機能を維持するには新テーマでの再登録が必要です。これにより、データの整合性を保ったままスムーズなテーマ移行が可能です。

カスタム投稿タイプにカスタムタクソノミーを設定

function register_recipe_post_type_and_taxonomy() {
   // カスタム投稿タイプの登録
   register_post_type('recipe', array(
       'labels' => array(
           'name' => 'レシピ',
           'singular_name' => 'レシピ',
       ),
       'public' => true,
       'show_ui' => true,
       'rewrite' => true,
       'has_archive' => true,
       'hierarchical' => true,
       'menu_position' => 5,
       'supports' => array('title', 'thumbnail'),
       'show_in_rest' => true,
   ));

   // カスタムタクソノミーの登録
   register_taxonomy('test', 'recipe', array(
       'labels' => array(
           'name' => 'テストカテゴリー',
           'singular_name' => 'テストカテゴリー',
           'menu_name' => 'テストカテゴリー'
       ),
       'hierarchical' => true,
       'public' => true,
       'show_ui' => true,
       'show_admin_column' => true,
       'show_in_rest' => true,
       'rewrite' => array('slug' => 'test')
   ));
}
add_action('init', 'register_recipe_post_type_and_taxonomy');

// サムネイル機能を有効にする
add_theme_support('post-thumbnails');
レシピ テストカテゴリー テストカテゴリー 名前 スラッグ 説明 カテゴリーが見つかりませんでした。

WordPressカスタムタクソノミーの絞り込み機能の実装方法

wp_dropdown_categories()関数

WordPressの管理画面の投稿一覧画面でカテゴリー選択メニューを表示(HTMLの<select>要素を生成するだけの関数、実際の絞り込み処理は別途必要

通常は restrict_manage_posts フックと組み合わせて使用:

add_action('restrict_manage_posts', function() {
    global $typenow;
    if ($typenow === 'recipe') {  // カスタム投稿タイプの場合
        wp_dropdown_categories([
            'show_option_all' => 'すべてのカテゴリー',
            'taxonomy' => 'test',
            'name' => 'test',
            // ... その他のオプション
        ]);
    }
});
1. ユーザーが絞り込みを実行 [すべてのカテゴリー ▼] → [test1] を選択 2. フォームがサブミット URL: /wp-admin/edit.php?post_type=recipe&test=19 3. WordPressがURLパラメータを受け取る $_GET[‘test’] = 19 を取得 4. parse_queryフック実行 term_id(19)からスラッグ(test1)に変換 $query->query_vars[‘test’] = ‘test1’ 5. WordPressがデータベースクエリを実行 6. 絞り込み結果を表示
// フィルターを適用するための設定
function convert_taxonomy_term_in_query($query) {
    global $pagenow, $typenow;
    $taxonomy = 'test';
    
    if ($pagenow === 'edit.php' && 
        $typenow === 'recipe' && 
        isset($_GET[$taxonomy]) && 
        $_GET[$taxonomy] != 0) {
        
        $term = get_term_by('id', $_GET[$taxonomy], $taxonomy);
        if ($term) {
            $query->query_vars['test'] = $term->slug;
        }
    }
}
// ユーザーが絞り込みボタンを押したときにフィルターを適用する
add_filter('parse_query', 'convert_taxonomy_term_in_query');
人気記事ランキング
話題のキーワードから探す