当ブログもそうですが大抵の WordPress テーマでは、記事ページにその記事が属するカテゴリーをリンク付きで表示してくれると思います。でも、カスタムタクソノミーはそうはいきませんね。最初からその記事が属するタクソノミーを表示してくれるテーマはあまりないと思います。
カスタムタクソノミーもカテゴリーのように表示させたいと思ったら、テーマを自分でカスタマイズする必要があります。
ちょっとタクソノミーを出力したいサイトがあって、Codex を見ていたら非常に簡単にタクソノミーを出力できる関数を見つけたので、出力の手順を備忘録的に残しておきたいと思います。
「get_the_term_list」を使って出力
get_the_term_list という関数は、指定したカスタムタクソノミーの情報を取得します。get_the_term_list で取得したデータを出力することで、その記事が属するタクソノミーをリンク付きで表示することができます。
使い方は簡単で、テーマ内の出力したい場所に以下のコードを記述します。
<?php echo get_the_term_list( $id, $taxonomy, $before, $sep, $after ); ?>
各パラメータは、以下のように指定しましょう。
$id:投稿ID。「$post->ID」にすれば開いているページのIDを取得します。
$taxonomy:カスタム分類名。出力したいタクソノミーの名前を入力します。
$before:カスタムタクソノミーの前に表示する文字(HTMLタグも可)
$sep:複数出力される場合の区切り文字(HTMLタグも可)
$after:カスタムタクソノミーの後ろに表示する文字(HTMLタグも可)
例えば、custom というカスタムタクソノミーを出力したい場合は、以下のように記述します。
<?php echo get_the_term_list($post->ID, custom, 'カスタム:', ' | '); ?>
タクソノミーの前には「カスタム:」、区切りには「 | 」が出力されます。使わないパラメータは省略して OK です。
「get_the_terms」を使って出力
get_the_terms も get_the_term_list と同じように、指定したタクソノミーの情報を取得することができます。get_the_term_list に比べて、出力するのが少し面倒ではありますが、該当記事が属するタームを表示させることができるので便利です。
まずは以下のコードでタームの情報を取得します。
<?php $terms = get_the_terms( $id, $taxonomy ); ?>
$id:投稿ID
$taxonomy:カスタム分類名
例えば、custom というカスタム分類名の場合、以下のように記述します。
<?php $terms = get_the_terms( $post->ID, 'custom' ); ?>
これだけでは、$terms に指定したタクソノミーの配列が返されるだけなので、以下のコードを追加してタームの情報を引き出して出力します。
<?php
foreach ($terms as $term) {
$term_name = $term->name;
echo '<p>'.esc_html($term_name).'</p>';
}
?>
まとめると、以下のようなコードになります。
<?php
$terms = get_the_terms($post->ID, 'custom');
foreach ($terms as $term) {
$term_name = $term->name;
echo '<p>'.esc_html($term_name).'</p>';
}
?>
これでその記事が属するタクソノミーの情報を出力することができます。
上記の場合、「$term->name」でターム名を取得しているだけですが、他にも「$term->term_id」でタームIDを取得したり、「$term->slug」でスラッグを取得できたりもします。
あとがき
カスタムタクソノミーを作成していたら、せっかくなので記事ページでも表示させたいですよね。
get_the_term_listの方が楽ですが、get_the_termsの方が汎用性がありますね。
はじめまして、岡本と申します。
ただいま、wordpressを使ってweb作成の勉強をしております。
解決しないことがあり、先生のお力を借りたいと思ってコメントを
させていただいた次第です。
現在、カスタム投稿タイプのプラグイン “CustomPostType UI” を
利用して個別の分類をしております。
その上で、目的はあるカスタム投稿タイプに関連付けた下記の
情報を取得することです。
① 設定したタクソノミーのslug, nameを取得
② ①のタクソノミーに関連付けたtermのslug, nameの取得
①については、
$taxes = get_object_taxonomies(‘カスタム投稿タイプ’);
foreach ($taxes as $tax){
echo $tax;
echo get_taxonomy($tax)->labels->name;
}
で期待通りの値が取得できていることが確認済みです。
一方で②については、
例えば、あるタクソノミー(slug:taxnomy1-slug)に、
タームがいくつか設定されているとして
$terms = get_terms($taxonomy1-slug);
print “ターム数:”;
print count($terms);
foreach($terms as $term){
print $term->name; print “”;
}
で表示させると、実際に投稿記事を作成しているものについては
表示されますが、タームを設定しただけで記事を持たないものに
ついては表示されない状態になっております。
結論を述べると、
タクソノミーは、記事作成の有無によらず設定したものをすべて取得
タームは、記事作成の有無で取得できる/できないの差が出ている。
といった状態です。
記事作成の有無によらず、タームをすべて取得する方法はございませんでしょうか?
不躾な質問で失礼は承知しておりますが、ご指南いただければ幸いでございます。
岡本さん、はじめまして^^
指定したタクソノミーのタームの名前をすべて出力したいということだと思いますが、get_termsの引数にhide_empty=0を追加することで記事が存在しないターム情報も取得できます。
すごく簡単なコードですが、以下のようにすればすべてのターム名が出力されますのでお試しください。
$terms = get_terms( 'タクソノミー名', 'hide_empty=0' );
foreach ( $terms as $term ) {
echo $term->name;
}
あとはお好みで整えていただければと思います。
himecas先生
岡本です。
早々のご回答ありがとうございます。
早速試してみたところ、期待通りの結果が得られました。
サイト上の登録フォームにて、
カスタム分類、カテゴリを連動式にして選択項目を
設けるために、本件を解決したいことが意図でした。
同じように悩んでいる人もいらっしゃるかもなので
本件の結論を以下にまとめておきます。
■get_terms($args)関数
argument:’hide_empty’
投稿記事のないタクソノミーを取得しない時 true(1)、
取得する時、false(0)、を指定する。
デフォルトはtrue(1)。
ですね。
完全に私の確認不足ですね、お手間かけて申し訳ございません。
また一つ勉強になりました。
どうもありがとうございます。
岡本さん、コメントありがとうございます。
まとめていただいた通りで、hide_emptyで取得するタームを操作します。
解決できてよかったですね。先生だなんてとんでもないです^^;
初めまして、花井と申します。
カスタム投稿&カスタム分類を使用するにあたって、解決出来ない点があり、質問させて頂きました。
により、ターム別のアーカイブページにリンク付きのターム名(アーカイブが属するターム名)を表示させる事は出来るのですが、同じカスタム投稿タイプ内の全てのターム名をリンク付きで表示させるにはどうすれば良いでしょうか?
現在のこの様に記述しています。
追記
記事が属しているカスタムタクソノミーの全てのターム名をリンク付きで取得したいのですが、どのように記述すれば良いでしょうか?
たぶんwp_list_categoriesかget_termsを使えばいけると思います。
「get_termsやwp_list_categoriesを使って指定したタクソノミーに属するすべてのタームリストを取得する方法」という記事で詳しく解説しているので、参考にしてください。
※コメント内に書かれていたコードは化けていたので削除しました。