Help us understand the problem. What is going on with this article?

WordPressのカスタムタクソノミー(分類)の扱い方

More than 3 years have passed since last update.

WordPressのカスタマイズで、カスタムタクソノミー(またはカスタム分類)は一番ややこしい要素のひとつです。ここでは、カスタムタクソノミー関連のテンプレートタグなどをまとめてみます。

カスタムタクソノミーを追加する

カスタムタクソノミーを追加する場合、プラグインなどで追加することもできますが、functions.phpに次を記述するのが簡単です。

functions.php
    register_taxonomy('area', 'post', array(
        'labels' => array(
            'name' => '地域'
        )
    ));

最初のパラメーターでタクソノミー名を、2つめのパラメーターで対象のオブジェクトタイプを指定します。「post」で投稿、「page」に固定ページに追加されます。他にも、カスタムポストタイプやリビジョンなども指定できます。

チェックボックスタイプにして、階層構造を有効にする

先の方法で追加すると、「タグ」のようにテキストフィールドで入力するタイプになります。

2015-10-27_9-03-58.png

3つめのパラメーターに「hierarchical」を追加すると、これを変更することができます。

functions.php
    register_taxonomy('area', 'post', array(
        'labels' => array(
            'name' => '地域'
        ),
        'hierarchical' => true
    ));

2015-10-27_9-11-00.png

タクソノミーページを作る

作ったタクソノミーは、次のようなURLで一覧することができます。

http://example.com/area/tokyo

この時、利用されるテンプレートファイルは以下の順で使われます。

  1. taxonomy-area-tokyo.php
  2. taxonomy-area.php
  3. taxonomy.php
  4. archive.php
  5. index.php

選ばれたタクソノミー名などを取得する

タクソノミーページで、選ばれているタクソノミーの情報を取得するには、ファイルの先頭の方で次のように記述します。

PHP
$area = get_query_var('area'); // パラメーターからタクソノミー名を取得
$term = get_term_by('slug', $area, 'area'); // スラッグからタクソノミーの情報を取得

echo esc_html($term->name); // ラベルを表示する

「$term」には他にも次のような内容が格納されています。

  • $term->term_id ... ID
  • $term->slug ... スラッグ
  • $term->description ... 説明文
  • $term->parent ... 親タクソノミー

さらに親を取得する場合は、次のようにしましょう。

PHP
...
$parent = get_term($area->parent, 'area');

記事が属しているタクソノミーを表示する

記事の詳細ページ(single.php)などで、その記事が属しているタクソノミーを表示するのは、次のテンプレートタグが一番簡単です。

php
the_terms(get_the_ID(), 'area');

次のような HTMLが出力されます。

HTML
<a href="https://custompostype-taxonomy-h2ospace-1.c9.io/event/area/hokaido/" rel="tag">北海道</a>, <a href="https://custompostype-taxonomy-h2ospace-1.c9.io/event/area/tokyo/" rel="tag">東京</a>

HTMLを自由に加工したい場合は「get_the_terms」を使います。

PHP
$terms = the_terms(get_the_ID(), 'area');

foreach ($terms as $term):
  echo '<li><a href=".../<?php echo esc_attr($term->slug); ?>/"><?php echo esc_html($term->name); ?></a></li>';
endforeach;

タクソノミーを判断する

ナビゲーションの処理などで、今表示されているタクソノミーがなにかを判断したい場合は、「is_tax」を使います(is_termは非推奨になりました)

PHP
<li class="nav<?php echo (is_tax('area', 'tokyo') ? ' active' : ''); ?>">東京</li>
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした