成果物をまとめて確認する
[成果物]WordPressで独自の分類軸を作る!タクソノミーの一覧表示とデータ抽出
【WordPressで独自の分類軸を作る!タクソノミーの一覧表示とデータ抽出】の成果物です。投稿の学びを終えた時点の構成を一覧でご確認いただけます。
前回の記事では、register_taxonomy
関数を使って独自の「店舗」タクソノミーを作成する方法を学習しました。
今回は、作成したタクソノミーを実際にWebページで表示・活用する方法を詳しく解説します。
今回の目標
目次
まず覚えておきたい重要なポイントがあります。
前回作成した「店舗タクソノミー」は'hierarchical' => true
で設定したため、標準カテゴリーとほぼ同じ仕組みで動作します。
つまり、これまでカテゴリーで学習した知識がそのまま活用できるということです。
タクソノミーの種類と対応関係:
hierarchical => true
)= 標準カテゴリーと同じhierarchical => false
)= 標準タグと同じこの記事では階層型タクソノミーに集中して解説します。タグ型タクソノミーも標準タグとほぼ同じなので、基本概念を理解すれば応用できます。
まずは、作成したタクソノミーを実際に使用するための準備を行います。
既存の投稿を編集して、各投稿に店舗を設定します。
お知らせページ(page-news.php)に店舗タクソノミーの一覧を表示します。
まず、カテゴリーとタクソノミーの関数の違いを見てみましょう。
// カテゴリーの場合(前回記事)
$categories = get_categories([
'hide_empty' => true
]);
// 店舗タクソノミーの場合(今回)
$stores = get_terms([
'taxonomy' => 'tax-store',
'hide_empty' => true,
]);
PHP'taxonomy'
の指定が必要なのでしょうか?それは、1つの投稿に対して複数のタクソノミーを設定できるからです。
カテゴリーの場合
get_categories()
は迷わず「カテゴリータクソノミー」のタームを取得できる独自タクソノミーの場合
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_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]);
PHPname__like
などget_categories()
にはないパラメータも使用可能つまり、get_terms()
は標準カテゴリーや標準タグなどすべてのタクソノミー対応の万能関数と考えることができます。
カテゴリー一覧でも使用したget_term_link()
関数がそのまま使用できます。
これは、カテゴリーも実際には「カテゴリータクソノミー」の一種だからです。WordPressでは以下のような設計になっています:
category
タクソノミーpost_tag
タクソノミーtax-store
タクソノミーすべて「タクソノミー」として統一的に扱われるため、同じget_term_link()
関数が使用できるのです。
この理解を踏まえて、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を新規作成し、以下のコードを記述します。
<?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のタイトル表示部分を修正します。
<?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')) {
PHP1つの投稿に複数のタクソノミーを設定できることは、テンプレート設計にも大きく影響します。
例:レストランチェーンサイトの場合
tax-store
):「渋谷店」「新宿店」「池袋店」tax-region
):「東京」「大阪」「名古屋」tax-level
):「一般」「VIP会員限定」この場合、以下のURLが全て存在することになります。
/news/store/渋谷店/ ← 店舗タクソノミー
/news/region/東京/ ← 地域タクソノミー
/news/level/vip/ ← レベルタクソノミー
全てのタクソノミーで共通の taxonomy.php
を使った場合
→ タクソノミーごとに異なるデザイン・情報が必要
WordPressは、カテゴリーと同様の階層構造でこの問題を解決します。
category.php ← 全カテゴリー共通(投稿に対してカテゴリーは1つ)
taxonomy.php ← 全タクソノミー共通(投稿に対してタクソノミーは複数)
↓ より具体的(優先度高)
taxonomy.php(全タクソノミー共通)
<?php
// シンプルな投稿一覧のみ
$target = get_queried_object();
// 基本的な投稿リスト表示
?>
PHPtaxonomy-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>';
// 投稿一覧表示
?>
PHPtaxonomy-tax-region.php(地域専用)
<?php
// 地域専用の追加情報
$target = get_queried_object();
echo '<div class="region-info">';
echo '<p>この地域の最新情報をお届けします</p>';
echo '</div>';
// 投稿一覧表示
?>
PHPWordPressは以下の順序でテンプレートを探します。
taxonomy.php
← 全タクソノミー共通archive.php
← 全アーカイブ共通index.php
← 最終フォールバックこの階層構造により、カテゴリーと全く同じ感覚で柔軟なテンプレート設計が可能になります。
もしtaxonomy.phpファイルが存在しない場合、WordPressは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,
]
];
}
PHPis_tax()
は以下のような使い分けができます。
is_tax()
– すべてのタクソノミーページで真is_tax('tax-store')
– 店舗タクソノミーページのみで真is_tax('tax-region')
– 地域タクソノミーページのみで真複数のタクソノミーを運用している場合は、具体的なタクソノミースラッグを指定する方が安全です。
この仕組みにより、専用テンプレートを作成しなくても、archive.phpでタクソノミーページを表示できます。
今回の記事で学習した重要なポイントを整理しましょう。
関数の対応関係
get_categories()
↔ get_terms(['taxonomy' => 'tax-store'])
get_queried_object()
→ どちらも同じ関数get_term_link()
→ どちらも同じ関数テンプレートの対応関係
条件分岐の対応関係
is_category()
↔ is_tax()
WordPressの設計は非常に一貫しており、カテゴリーで学んだ知識がタクソノミーでもそのまま活用できます。
独自タクソノミーを扱う際の主な違いは、複数のタクソノミーが存在するため「どのタクソノミーを対象とするか」を明示する必要があることです。
get_terms()
では'taxonomy' => 'tax-store'
を指定WP_Query
ではtax_query
を使用is_tax()
を指定この理解により、タグ型タクソノミー('hierarchical' => false
)も標準タグとほぼ同じ動作をすることが想像できるでしょう。
WordPressのタクソノミーシステムは、カテゴリーとタグという既存の仕組みを拡張した、非常に理解しやすい設計になっています。
次回は、カスタム投稿タイプの作成について詳しく解説します。
register_post_type
関数の使い方をマスターする基本的な考え方はタクソノミーと同じですが、カスタム投稿タイプならではの特徴や実用的な活用方法についても詳しく解説します。お楽しみに!
この記事で作成した成果物は、以下のページでまとめて確認することができます。
WordPressで独自の分類軸「タクソノミー」を作成する方法を詳しく解説します。カテゴリーやタグだけでは不十分な複雑な分類に対応するため、独自分類システムの実装方法、適切な命名規則、各種設定項目の詳細を実例とともに学習できます。より柔軟な投稿管理を実現したい方におすすめの内容です。
標準投稿とは独立したコンテンツ管理を実現し、企業サイトでお知らせとブログを分けたり、レストランでメニューを専用管理したりできます。今回はカフェメニューを例に、作成から投稿まで段階的に学習。管理画面での表示設定、URL構造の最適化、専用タクソノミーの追加方法を実践的に習得できます。
WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。
学習ストーリー第37話まで掲載中