Custom Taxonomy 機能を導入するまで の続きです。

投稿ページやアーカイブページに Custom Taxonomy を表示します。is_tax を使った条件分岐や、wp_tag_cloud も利用可能です。

また、 query_posts にタクソノミーを指定すれば、様々な場所で特定termの記事リストを表示することもできます。

以下、WordPress バージョン2.91 または 2.92 での検証です。

投稿ページなどで使う get_the_term_list

記事の分類に使われている、カスタムタクソノミーのtermリストを表示します。主に投稿ページ(single.php)やアーカイブページのループ内で使い、下記の例では、タクソノミー「artist」に該当するtermリストが表示されます。

引数(1, '2', '3', '4', '5' )
1. 投稿ID
2. タクソノミーを指定(名前)
3. タームリストの最初に入れる文字やコード
4. タームとタームを区切る文字やコード
5. タームリストの最後に入れる文字やコード
<?php echo get_the_term_list( $post->ID, 'artist', 'アーティスト: ', ' , ', '' ); ?>

アーティスト: エグザイルZOO

<?php echo get_the_term_list( $post->ID, 'artist', '<ul><li>', '</li><li>', '</li></ul>' ); ?>
  • エグザイル
  • ZOO

get_the_terms でターム名やスラッグを取り出す

get_the_term_list はリンク形式でタームリストが表示されますが、タームの名前だけを表示したい場合は、get_the_terms で実現できます。

if ( $terms = get_the_terms($post->ID, 'artist') ) {
    echo '<ul>';
    foreach ( $terms as $term ) {
        echo '<li>' . esc_html($term->name) . '</li>';
    }
    echo '</ul>';
}
  • エグザイル
  • ZOO

スラッグを取得したい場合は、5行目の $term->name を $term->slug に。

タクソノミーのアーカイブページ(ループ外)

各タクソノミーのアーカイブページは、テーマに taxonomy.php というテンプレートを追加することによって、独自の表示方法にすることもできます。

例えば、http://example.com/artist/exaile というURLにリクエストがあった場合、下記の順番にテンプレートを探し、最初にマッチしたものが適用されます。※ term IDでの指定はできないようです。

  1. taxonomy-artist-exaile.php (taxonomy および term slug 一致)
  2. taxonomy-artist.php (taxonomy 一致)
  3. taxonomy.php
  4. archive.php
  5. index.php

タイトル(term名)や概要の表示

検索不足なのか、まだ用意されていないのか分かりませんが、single_cat_title() や single_tag_title() のようなテンプレートタグが発見できず。下記のような記述で代用。

$term = $wp_query->queried_object;
echo esc_attr($term->name);

$term->slug でスラッグが、 $term->description で概要が表示できます。なお、概要の表示には term_description() という関数も用意されています。

追記: WP 3.1 から、「single_term_title()」という関数が用意されます。

<?php wp_title(''); ?>

こちらは「アーティスト エグザイル」のようにラベルも表示されます。

追記:ラベル名の取得
wp_title() の内部処理を見ると、タクソノミーのページでは、get_taxonomy() でラベル名を取得しています。タイトルのカスタマイズや、パンくずリストにラベルを含めたいケースも出てくると思うので、一応メモしておきます。
$term = $wp_query->queried_object;
$label = get_taxonomy($term->taxonomy)->label;
    // 出力
    echo esc_attr($label) . '>' . esc_attr($term->name);

/*
出力結果:アーティスト > コブクロ
*/

termのリンク(URL)

echo get_term_link( $term, $taxonomy );

第一引数にタームスラッグを、第二引数にそのタクソノミ名を渡すと、http://example.com/artist/exaile のように URL が取得できます。

条件分岐

is_tax()

タクソノミー関連の条件分岐には、is_tax() を利用します。 if (is_tax('artist')) として、特定のタクソノミーを指定することもできます。※ term IDでの指定はできないようです。

is_term()

さらにタームで分岐したい場合は、 is_term() を利用します、と言いたいところですが、これがうまく動作してくれません。(なぜ?) なので、もしタームでの条件分岐が必要な場合は、今のところ下記のようなコードで代用しています。

タームのスラッグが 'exaile' の場合分岐する

// テンプレートの最初などに
<?php
$term = get_term_by(
    'slug',
    get_query_var('term'),
    get_query_var('taxonomy')
);
?> 
// 条件分岐したい箇所に
<?php if ( $term->slug === 'exaile' ) : ?>
表示したい内容
<?php endif; ?>

カスタムタクソノミーの一覧表示

タグクラウド形式

通常のタグクラウド同様に、wp_tag_cloud() に用意されている引数を追加して表示方法を調整することができます。

<?php wp_tag_cloud( array('taxonomy' => 'artist') ); ?>

リスト形式

wp_list_categories() を利用することで実現できます。(WP3.0以降)デフォルトでは 'taxonomy' => 'category' という設定なので、これをタクソノミーの名前に変更し、用意されている引数で調整すれば、好みの表示形式にすることができます。
Codex: wp list categories

<?php wp_list_categories('taxonomy=artist'); ?>

get_terms() を使った一覧表示

get_terms でも一覧表示を実現できます。orderby を利用して、名前やカウント数(関連記事数)による並び替えも可能です。(デフォルトは orderby=name)

get_terms で取得できる値

[term_id] => 9  // ID
[name] => エグザイル  // 名前
[slug] => exaile  // スラッグ
[term_group] => 0  // グループ
[term_taxonomy_id] => 9  // タームID 
[taxonomy] => artist  // タクソノミー
[description] => 日本のダンスユニット、歌手  // 概要
[parent] => 0  // 階層形式
[count] => 50  // 記事数

コードサンプル

<ul class="artist-list">
<?php
$home = site_url('/');
$artist = get_terms( 'artist', 'order=ASC' );
    foreach ( $artist as $term ) {
    echo '<li><a href="' . $home . $term->taxonomy . '/' . $term->slug . '">' . esc_html($term->name) . '</a></li>';
     }
?>
</ul>

URLの一部に、$term->taxonomy を使っていますが、rewrite slug を変更している場合は注意が必要です。文字列で指定したほうがいいかも。

query_posts で使う

//taxonomyがartistで、termがexaile の記事を5件表示
query_posts( 'artist=exaile&posts_per_page=5' );
// カテゴリーID1か4に属し、taxonomyがartistで、termがzoo の記事を5件表示
query_posts( 'cat=1,4&artist=zoo&posts_per_page=5' );

上手くいかなかったこと

カテゴリーID4に属し、taxonomy がartist の記事を5件表示、という使い方はできないようです。(?)

× query_posts( 'cat=4&taxonomy=artist&posts_per_page =5' );

また、複数指定がうまくいきませんでした。1.は表示されず、2.は後方だけマッチするようです。

× query_posts( 'artist=exaile,zoo&posts_per_page=5' );
× query_posts( 'artist=exaile&artist=zoo&posts_per_page=5' );

素人のメモです。できることをできない、できないことをできる、簡単なことを難しく記述している場合があります。また、サンプルコード(PHP)の安全性、正確性は保障できかねます。

参考にさせていただきました:Using custom taxonomies to create a movie database