このページには続きがあります。
WP カスタムタクソノミーの表示方法や条件分岐などのメモ

WordPress 2.8 から導入された「カスタムタクソノミー」ですが、プラグインの対応状況や、現在利用している「タグ」との兼ね合いから導入を見送っている方も多く、日本ではまだまだ馴染みが薄いように感じます。

個人的には、Custom Taxonomy として設定したterm(ターム)が「WPの検索に引っかからない」というところがネックでしたが、先日6.5にバージョンアップとなった「Search Everything」で、Custom Taxonomyも検索範囲に含めることが可能になりました。

一度は断念していたこの機能ですが、再度導入してみたいと思います。

カスタムタクソノミーとは?

名前のとおり「カスタマイズできる分類機能」ということになりますが、カテゴリーやタグもタクソノミーの一種で、カテゴリーは category 、タグは post_tag として管理されています。

一般的な呼称 taxonomy URLベース term
カテゴリー category category * 変更可能 複数設定可能
リンクカテゴリー link_category ---
タグ post_tag tag * 変更可能
カスタムタクソノミー 設定した名前 自由な文字列に設定可能

term は「***」 部分のこと。
・http://example.com/tag/***
・http://example.com/category/***
・http://example.com/mytaxonomy/***

Custom Taxonomy 導入後のイメージ

例えば、「エンタメ情報サイト」を運営し、ある日本の名曲について記事を書いたとします。

今まで

音楽というカテゴリーに属する記事とし、歌手や作詞者、ジャンルなどをタグに設定して細分化します。各タグのアーカイブページURLは、タグベースを変更していなければ「http://example.com/tag/***」となります。

表示位置の変更は可能ですが、それを同類タグごとに任意の場所に表示させるのは複雑な感じがして、タイトルや記事内容の直後に配置することが多いと思います。

導入後

一方、Custom Taxonomy を利用した場合は、「http://example.com/arrangement/sakamoto-ryuichi」のように、タグ(term)ごとに意味のあるURLで細分(グループ分け)することができ、テンプレートを弄ることで、そのタクソノミーごとに表示位置を変えることも比較的容易に実現できます。

Custom Taxonomy を使えるようにする

実際に、「アーティスト」と「ジャンル」という Custom Taxonomy を設定してみます。テーマの functions.php に以下のコードを追加。

add_action( 'init', 'create_my_taxonomies', 0 );
function create_my_taxonomies() {

    register_taxonomy(
        'artist', 'post', array(
            'hierarchical' => false,
            'label' => 'アーティスト',
            'query_var' => true,
            'rewrite' => true
        ) );

    register_taxonomy(
        'genre', 'post', array(
            'hierarchical' => false,
            'label' => 'ジャンル',
            'query_var' => true,
            'rewrite' => true
        ) );

}

4~10、12~18行目の記述を増やすことでタクソノミーを複数設定することができます。

4~10行目の説明

'artist', 'post',

artist : taxonomy の名前。原則URLのベースとなります。
post :投稿で利用することを意味します。

カスタム投稿タイプなどを含めたいときは、配列で指定します。

'artist', array( 'post', 'music', 'page', 'attachment' ),

これで、投稿、カスタム投稿タイプ music、ページ、アタッチメントで利用できるようになります。

'hierarchical' => false

カテゴリーのような階層形式を利用できるようにするか否か。falseはしない。現時点のWPでは true にしても階層形式にはできないようです。

開発版(3.0-beta1)を試しましたが、WordPress 3.0 では可能のようです。ただ、URL自体は階層形式になりませんでした。

'label' => 'アーティスト'

メニューなどで利用される表示名。その他には、 wp_title('') とした場合「アーティスト エグザイル」のようにこのラベル名も表示されます。

'query_var' => true

get_query_var などと呼び出す時のクエリ変数に関係していると思いますが、僕の知識では説明できません。 'query_var' => '任意の文字列', などとして変更することも可能ですが無難に true にしておきます。

'rewrite' => true

true の場合は、最初の taxonomy で指定した文字列がURLのベースとなります。
┗ http://example.com/artist/exaile

  • taxonomy の名前と違う文字列にする場合
    'rewrite' => array('slug' => 'at')
    ┗ http://example.com/at/exaile

  • タクソノミー自体を無理やり階層形式に見せたい場合(カテゴリー名を利用するとそれっぽくなるかも…)
    'rewrite' => array('slug' => 'music/artist')
    ┗ http://example.com/music/artist/exaile

  • ベースをなくしたい場合
    'rewrite' => array('slug' => '')
    ┗ http://example.com/exaile

管理画面

functions.php をアップロードすると、管理画面に各リンクや term を追加するフィールドが表示されますので、あとはタグを追加するのと同じ要領で投稿に関連付けします。

※functions.php をアップロードしたら、「パーマリンク設定」から[変更を保存]ボタンを押して更新します。何も変更する必要はありませんが、これをしないと rewrite_rule が更新されないので、カスタムタクソノミーのアーカイブページが404になってしまいます。

左側に、カスタムタクソノミー作成・編集ページへのリンクが追加されます。

投稿画面では右側にフィールドが追加されます。

素人のメモです。実際に導入した過程を記述していますが、間違いや誤った認識が含まれているかもしれません。

参照サイト:Custom taxonomies in WordPress 2.8