LoginSignup
65
70

More than 5 years have passed since last update.

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

Posted at

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>
65
70
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65
70