2025年08月05日[火曜日]

WordPressで独自の分類軸を作る!タクソノミーの一覧表示とデータ抽出

  • 2025/08/02
  • BASICS
  • WordPressの基礎
  • 0comments
  • 61views
  • 約21分で読めます
  • 35

前回の記事では、register_taxonomy関数を使って独自の「店舗」タクソノミーを作成する方法を学習しました。

今回は、作成したタクソノミーを実際にWebページで表示・活用する方法を詳しく解説します。

今回の目標

  • 投稿と店舗タクソノミーを紐づける
  • 店舗タクソノミー一覧を表示する
  • 店舗別投稿一覧を作成する
  • テンプレート設計を理解する

重要な概念 – 階層タクソノミー ≒ 標準カテゴリー

まず覚えておきたい重要なポイントがあります。

前回作成した「店舗タクソノミー」は'hierarchical' => trueで設定したため、標準カテゴリーとほぼ同じ仕組みで動作します。

つまり、これまでカテゴリーで学習した知識がそのまま活用できるということです。

タクソノミーの種類と対応関係:

  • 階層タクソノミー(hierarchical => true)= 標準カテゴリーと同じ
  • 非階層タクソノミー(hierarchical => false)= 標準タグと同じ

この記事では階層型タクソノミーに集中して解説します。タグ型タクソノミーも標準タグとほぼ同じなので、基本概念を理解すれば応用できます。

事前準備 – 各投稿に店舗を設定

まずは、作成したタクソノミーを実際に使用するための準備を行います。

管理画面での店舗ターム追加

WordPress管理画面で投稿店舗にアクセスします。

操作方法はカテゴリーの追加と全く同じです。

以下のような店舗を追加してください。

  • 渋谷店(shibuya
  • 新宿店(sinjuku
  • 池袋店(ikebukuro
  • 全店(all

各投稿への店舗割り当て

既存の投稿を編集して、各投稿に店舗を設定します。

投稿編集画面を開くと、右側のサイドバーに「店舗」という項目が表示されています。

投稿へのカテゴリー設定と全く同じ操作です。

  • チェックボックスで店舗を選択
  • 複数選択も可能

投稿一覧のクイック編集から店舗タクソノミーを選択することもできます。

テスト用に以下のような割り当てを行ってください。

  • 「SNS総フォロワー100人を達成しました」→ 渋谷店
  • 「WordPress講習会開催のお知らせ」→ 新宿店、池袋店
  • 「夏季休暇のお知らせ」→ 全店

お知らせページに店舗一覧を表示

お知らせページ(page-news.php)に店舗タクソノミーの一覧を表示します。

なぜget_terms()には’taxonomy’指定が必要なのか

まず、カテゴリーとタクソノミーの関数の違いを見てみましょう。

// カテゴリーの場合(前回記事)
$categories = get_categories([
    'hide_empty' => true
]);

// 店舗タクソノミーの場合(今回)
$stores = get_terms([
    'taxonomy' => 'tax-store',
    'hide_empty' => true,
]);
PHP
なぜget_terms()には'taxonomy'の指定が必要なのでしょうか?

それは、1つの投稿に対して複数のタクソノミーを設定できるからです。

カテゴリーの場合

  • 1つの投稿には1つのカテゴリーというタクソノミーしか存在しない
  • そのためget_categories()は迷わず「カテゴリータクソノミー」のタームを取得できる

独自タクソノミーの場合

  • 1つの投稿に「店舗」「地域」「レベル」など複数のタクソノミーが存在する可能性がある
  • そのためget_terms()は「どのタクソノミーのタームを取得するか」を明示する必要がある

実際の例で考えてみましょう

レストランチェーンのお知らせサイトの場合

  • カテゴリー:「新メニュー」「キャンペーン」「休業案内」
  • 店舗タクソノミー:「渋谷店」「新宿店」「池袋店」
  • 地域タクソノミー:「東京」「大阪」「名古屋」

この場合、以下のような使い分けが必要になります。

// 店舗一覧を取得したい場合
$stores = get_terms([
    'taxonomy' => 'tax-store',
    'hide_empty' => true,
]);

// 地域一覧を取得したい場合  
$regions = get_terms([
    'taxonomy' => 'tax-region',
    'hide_empty' => true,
]);
PHP

get_terms()の柔軟性と統一性

実はget_terms()は非常に柔軟で、標準のカテゴリーやタグも取得できます。

// get_terms()でカテゴリーを取得(get_categoriesと同じ結果)
$categories = get_terms([
    'taxonomy' => 'category',
    'hide_empty' => true,
]);

// get_terms()でタグを取得(get_tagsと同じ結果)
$tags = get_terms([
    'taxonomy' => 'post_tag', 
    'hide_empty' => true,
]);
PHP

実際、get_categories()get_tags()は内部的にget_terms()を呼び出しているだけの関数です。

つまり、以下の書き方は完全に同じ結果になります:

// この書き方と...
$categories = get_categories(['hide_empty' => true]);
// この書き方は同じ
$categories = get_terms(['taxonomy' => 'category', 'hide_empty' => true]);

// この書き方と...
$tags = get_tags(['hide_empty' => true]);
// この書き方は同じ
$tags = get_terms(['taxonomy' => 'post_tag', 'hide_empty' => true]);
PHP

つまり、すべてのタクソノミーでget_terms()を使って統一することができます。

// すべてget_terms()で統一(推奨)
$categories = get_terms(['taxonomy' => 'category', 'hide_empty' => true]);
$tags = get_terms(['taxonomy' => 'post_tag', 'hide_empty' => true]);
$stores = get_terms(['taxonomy' => 'tax-store', 'hide_empty' => true]);
PHP
get_terms()統一のメリット
  1. 覚える関数が1つだけ – 学習コストが下がる
  2. 一貫性のあるコード – すべてのタクソノミーで同じ書き方
  3. 機能が豊富name__likeなどget_categories()にはないパラメータも使用可能
  4. タクソノミー概念の理解 – 「カテゴリーもタクソノミーの一種」という設計思想が明確になる

つまり、get_terms()標準カテゴリーや標準タグなどすべてのタクソノミー対応の万能関数と考えることができます。

リンク生成も同じget_term_link()関数

カテゴリー一覧でも使用したget_term_link()関数がそのまま使用できます。

これは、カテゴリーも実際には「カテゴリータクソノミー」の一種だからです。WordPressでは以下のような設計になっています:

  • 標準カテゴリー = categoryタクソノミー
  • 標準タグ = post_tagタクソノミー
  • 独自タクソノミー = tax-storeタクソノミー

すべて「タクソノミー」として統一的に扱われるため、同じget_term_link()関数が使用できるのです。

実際の実装

この理解を踏まえて、page-news.phpに店舗一覧を表示してみましょう。

page-news.php
<?php get_header();?>

<?php the_content(); ?>

<?php
// カテゴリー一覧を取得
$categories = get_categories([
    'hide_empty' => true, // 投稿がないカテゴリーは除外
    'orderby' => 'term_order', // 管理画面と同じ並び順
    'order' => 'asc',
]);

echo '<h2>カテゴリー</h2>' . PHP_EOL;
echo '<ul class="category-list">' . PHP_EOL;

foreach ($categories as $category) {
    echo '<li><a href="'.get_term_link($category->term_id).'">'.$category->name.'</a></li>'.PHP_EOL;
}

echo '</ul>' . PHP_EOL;

// タグ一覧を取得
$tags = get_tags([
  'hide_empty' => true, // 投稿がないタグは除外
  'orderby' => 'name',
  'order' => 'asc',
]);

echo '<h2>タグ</h2>' . PHP_EOL;
echo '<ul class="tag-list">' . PHP_EOL;

foreach ($tags as $tag) {
  echo '<li><a href="'.get_term_link($tag->term_id).'">'.$tag->name.'</a></li>'.PHP_EOL;
}

echo '</ul>' . PHP_EOL;

// 月別一覧を追加
echo '<h2>月別</h2>' . PHP_EOL;
echo '<ul>'.PHP_EOL;
wp_get_archives([
  'type' => 'monthly',
  'format' => 'html',
  'echo' => true,
]);
echo '</ul>'.PHP_EOL;


// 店舗タクソノミーの一覧を取得
$stores = get_terms([
  'taxonomy' => 'tax-store',
  'hide_empty' => true,
]);

echo '<h2>店舗別</h2>' . PHP_EOL;
echo '<ul class="store-list">' . PHP_EOL;
foreach ($stores as $store) {
  echo '<li><a href="'.get_term_link($store->term_id).'">'.$store->name.'</a></li>' . PHP_EOL;
}
echo '</ul>' . PHP_EOL;
?>

<p>※このページは page-news.php テンプレートで表示されています</p>

<?php get_footer();?>
PHP

表示の確認

お知らせページを開いて店舗一覧が表示されることを確認しましょう。

店舗タクソノミー別投稿一覧

次に、各店舗をクリックした時の一覧ページを作成します。

テンプレートファイルの対応関係

カテゴリーのときはcategory.php テンプレートを使用しました。タクソノミーの場合は、taxonomy.php テンプレートを使用します。

基本構造は全く同じです。

taxonomy.phpファイルの新規作成

taxonomy.phpを新規作成し、以下のコードを記述します。

taxonomy.php
<?php get_header();?>

<?php

$target = get_queried_object();

// そのカテゴリーに属する投稿を取得
$args = [
  'post_type' => 'post',
  'post_status' => 'publish',
  'orderby' => 'title',
  'order' => 'asc',
  'tax_query' => [
    [
      'taxonomy' => $target->taxonomy,
      'field' => 'term_id',
      'terms' => $target->term_id,
    ]
  ]
];

$query = new WP_Query($args);

echo '<ul class="post-list">' . PHP_EOL;

while ($query->have_posts()) {
  $query->the_post();

  // 投稿のカテゴリーを取得
  $categories = get_the_category();
  $category_name = !empty($categories) ? $categories[0]->name : '';

  echo '<li>'.
    '<span class="date">'.get_the_date('Y年m月d日').'</span>'.
    '<span class="category">'.$target->name.'</span>'.
    '<a href="'.get_the_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'.
    '</li>'.PHP_EOL;
}

wp_reset_postdata(); // 投稿データをリセット


echo '</ul>' . PHP_EOL;
?>		

<p>※このページは taxonomy.php テンプレートで表示されています</p>
<?php get_footer();?>
PHP

関数の対応関係

カテゴリーページ(category.php)との比較を見てみましょう。

// 現在の情報取得(どちらも同じ関数!)
$target = get_queried_object();

// WP_Queryでの絞り込み条件の違い
// カテゴリーの場合
'category__in' => [$target->term_id]

// タクソノミーの場合  
'tax_query' => [
  [
    'taxonomy' => $target->taxonomy,
    'field' => 'term_id',
    'terms' => $target->term_id,
  ]
]
PHP

違いは絞り込み条件の書き方のみです。get_queried_object()で取得できる情報は全く同じです。

ページタイトル表示の修正

header.phpのタイトル表示部分を修正します。

header.php
<?php
if (is_category()) {
  $category = get_queried_object();
  echo '<h1 class="page-title">'.$category->name.'のお知らせ</h1>'.PHP_EOL;
} elseif (is_tag()) {
  $tag = get_queried_object();
  echo '<h1 class="page-title">タグ「'.$tag->name.'」のお知らせ</h1>'.PHP_EOL;
} elseif ( is_date() ) {
  $title_date = '';
  if( get_query_var('year') ) {
    $title_date .= get_query_var('year').'年';
  }
  if( get_query_var('monthnum') ) {
    $title_date .= get_query_var('monthnum').'月';
  }
  if( get_query_var('day') ) {
    $title_date .= get_query_var('day').'日';
  }

  echo '<h1 class="page-title">'.$title_date.'のお知らせ</h1>'.PHP_EOL;
} elseif (is_tax()) {
  $tax = get_queried_object();
  echo '<h1 class="page-title">タグ「'.$tax->name.'」のお知らせ</h1>'.PHP_EOL;
} elseif (!is_front_page()) {
  echo '<h1 class="page-title">'. get_the_title() .'</h1>'.PHP_EOL;
}
?>
PHP

構造は全く同じで、is_tax()でタクソノミー指定するだけです。

// 全タクソノミー共通
} elseif (!is_front_page()) {

// 店舗タクソノミーに限定
} elseif (!is_front_page('tax-store')) {
PHP

表示の確認

タイトルに店舗名が反映され、対象店舗の投稿が一覧として表示されることを確認してください。

複数タクソノミー運用時のテンプレート設計

1つの投稿に複数のタクソノミーを設定できることは、テンプレート設計にも大きく影響します。

複数タクソノミー運用時の課題

例:レストランチェーンサイトの場合

  • 店舗タクソノミー(tax-store):「渋谷店」「新宿店」「池袋店」
  • 地域タクソノミー(tax-region):「東京」「大阪」「名古屋」
  • レベルタクソノミー(tax-level):「一般」「VIP会員限定」

この場合、以下のURLが全て存在することになります。

/news/store/渋谷店/   ← 店舗タクソノミー
/news/region/東京/   ← 地域タクソノミー  
/news/level/vip/    ← レベルタクソノミー
taxonomy.php だけでは対応しきれない

全てのタクソノミーで共通の taxonomy.php を使った場合

  • 店舗ページでは「○○店の地図」を表示したい
  • 地域ページでは「○○地域の天気情報」を表示したい
  • レベルページでは「会員特典情報」を表示したい

タクソノミーごとに異なるデザイン・情報が必要

WordPressテンプレート階層での解決方法

WordPressは、カテゴリーと同様の階層構造でこの問題を解決します。

【カテゴリーの場合】

category.php ← 全カテゴリー共通(投稿に対してカテゴリーは1つ)

【タクソノミーの場合】

taxonomy.php ← 全タクソノミー共通(投稿に対してタクソノミーは複数)

↓ より具体的(優先度高)

  • taxonomy-tax-store.php ← 店舗タクソノミー専用
  • taxonomy-tax-region.php ← 地域タクソノミー専用
  • taxonomy-tax-level.php ← レベルタクソノミー専用

実用的な使い分け例

taxonomy.php全タクソノミー共通

<?php
// シンプルな投稿一覧のみ
$target = get_queried_object();
// 基本的な投稿リスト表示
?>
PHP

taxonomy-tax-store.php(店舗専用)

<?php  
// 店舗専用の追加情報
$target = get_queried_object();
echo '<div class="store-info">';
echo '<p>住所:東京都渋谷区...</p>';
echo '<p>電話:03-1234-5678</p>';
echo '<p>営業時間:10:00-22:00</p>';
echo '</div>';

// 投稿一覧表示
?>
PHP

taxonomy-tax-region.php(地域専用)

<?php
// 地域専用の追加情報
$target = get_queried_object();
echo '<div class="region-info">';
echo '<p>この地域の最新情報をお届けします</p>';
echo '</div>';

// 投稿一覧表示  
?>
PHP

テンプレート優先順位の確認

WordPressは以下の順序でテンプレートを探します。

  1. taxonomy-{taxonomy名}.php ← タクソノミー専用
  2. taxonomy.php ← 全タクソノミー共通
  3. archive.php ← 全アーカイブ共通
  4. index.php ← 最終フォールバック

この階層構造により、カテゴリーと全く同じ感覚で柔軟なテンプレート設計が可能になります。

アーカイブでの統合管理

専用テンプレートが無い場合の動作

もしtaxonomy.phpファイルが存在しない場合、WordPressはarchive.phpを使用してタクソノミーページを表示します。

前回の記事で学習したarchive.phpでの統合管理が、タクソノミーにも適用されるということです。

条件分岐での統合処理

archive.phpでは以下のような条件分岐で、カテゴリー・タグ・タクソノミーを統合して処理できます。

archive.php
// ページの種類に応じて抽出条件を追加
if (is_category()) {
  // カテゴリーページの場合
  $category = get_queried_object();
  $args['category__in'] = [$category->term_id];
} elseif (is_tag()) {
  // タグページの場合
  $tag = get_queried_object();
  $args['tag__in'] = [$tag->term_id];
} elseif (is_date()) {
  // 日付ページの場合
  if (is_year()) {
    // 年の場合
    $args['date_query'] = [
      [
        'year' => (int)get_query_var('year'),
      ]
    ];
  } elseif (is_month()) {
    // 年月の場合
    $args['date_query'] = [
      [
        'year' => (int)get_query_var('year'),
        'month' => (int)get_query_var('monthnum'),
      ]
    ];
  } elseif (is_day()) {
    // 年月日の場合
    $args['date_query'] = [
      [
        'year' => (int)get_query_var('year'),
        'month' => (int)get_query_var('monthnum'),
        'day' => (int)get_query_var('day'),
      ]
    ];
  }
} elseif (is_tax()) {
  // タクソノミーの場合
  $tax = get_queried_object();
  $args['tax_query'] = [
    [
      'taxonomy' => $tax->taxonomy,
      'field' => 'term_id',
      'terms' => $tax->term_id,
    ]
  ];
}
PHP
is_tax()でのタクソノミー指定

is_tax()は以下のような使い分けができます。

  • is_tax() – すべてのタクソノミーページで真
  • is_tax('tax-store') – 店舗タクソノミーページのみで真
  • is_tax('tax-region') – 地域タクソノミーページのみで真

複数のタクソノミーを運用している場合は、具体的なタクソノミースラッグを指定する方が安全です。

この仕組みにより、専用テンプレートを作成しなくても、archive.phpでタクソノミーページを表示できます。

表示の確認

archive.php がテンプレートとして適用されるためには、taxonomy.phpが存在しないことが条件となります。old_taxonomy.php などにファイル名を変更してください。

「このページは archives.php テンプレートで表示されています」が表示されていることを確認してください。

まとめ

今回の記事で学習した重要なポイントを整理しましょう。

階層タクソノミー ≒ 標準カテゴリー

関数の対応関係

  • get_categories()get_terms(['taxonomy' => 'tax-store'])
  • get_queried_object() → どちらも同じ関数
  • get_term_link() → どちらも同じ関数

テンプレートの対応関係

  • category.phptaxonomy.php
  • category-{slug}.phptaxonomy-{taxonomy}.php
  • category-{id}.phptaxonomy-{taxonomy}-{term}.php

条件分岐の対応関係

  • is_category()is_tax()

WordPressの設計は非常に一貫しており、カテゴリーで学んだ知識がタクソノミーでもそのまま活用できます。

重要な違いは「taxonomy指定」のみ

独自タクソノミーを扱う際の主な違いは、複数のタクソノミーが存在するため「どのタクソノミーを対象とするか」を明示する必要があることです。

  • get_terms()では'taxonomy' => 'tax-store'を指定
  • WP_Queryではtax_queryを使用
  • 条件分岐ではis_tax()を指定

タグ型タクソノミーも標準タグと同じ

この理解により、タグ型タクソノミー('hierarchical' => false)も標準タグとほぼ同じ動作をすることが想像できるでしょう。

WordPressのタクソノミーシステムは、カテゴリーとタグという既存の仕組みを拡張した、非常に理解しやすい設計になっています。

次回予告

次回は、カスタム投稿タイプの作成について詳しく解説します。

  • 標準の「投稿」とは別の投稿タイプを作成する
  • register_post_type関数の使い方をマスターする
  • より柔軟なサイト構築を実現する

基本的な考え方はタクソノミーと同じですが、カスタム投稿タイプならではの特徴や実用的な活用方法についても詳しく解説します。お楽しみに!

成果物

この記事で作成した成果物は、以下のページでまとめて確認することができます。

成果物をまとめて確認する

この記事の評価をお願いします

評価をすると「既読」となり、まだ読んでいない記事を区別できます。

この投稿をシェアする

コメントを残す

CAPTCHA



WordPressで独自の分類軸を作る!タクソノミーで投稿管理を拡張

WordPressで独自の分類軸を作る!タクソノミーで投稿管理を拡張  BASICS

WordPressで独自の分類軸「タクソノミー」を作成する方法を詳しく解説します。カテゴリーやタグだけでは不十分な複雑な分類に対応するため、独自分類システムの実装方法、適切な命名規則、各種設定項目の詳細を実例とともに学習できます。より柔軟な投稿管理を実現したい方におすすめの内容です。

  • 2025/08/02
  • 0comments
  • 84views

WordPressカスタム投稿タイプ前編:カフェメニューの作成と投稿

WordPressカスタム投稿タイプ前編:カフェメニューの作成と投稿  BASICS

標準投稿とは独立したコンテンツ管理を実現し、企業サイトでお知らせとブログを分けたり、レストランでメニューを専用管理したりできます。今回はカフェメニューを例に、作成から投稿まで段階的に学習。管理画面での表示設定、URL構造の最適化、専用タクソノミーの追加方法を実践的に習得できます。

  • 2025/08/04
  • 0comments
  • 54views

STAY CONNECTED

wp-ch Admin

現役のフリーランスエンジニアがWordPressによるWebサイト構築を基礎から実践テクニックまで徹底解説します。

たくさんの方がフォローしてくれています。あなたもぜひ、情報を受け取ってください。

STORY|ストーリー

WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。

学習ストーリー第37話まで掲載中

全ストーリーを見る