カスタムタクソノミーをカテゴリーのように記事ページに出力する便利な関数「get_the_term_list」と「get_the_terms」

カスタムタクソノミーをカテゴリーのように記事ページに出力する便利な関数「get_the_term_list」と「get_the_terms」

カスタムタクソノミーをカテゴリーのように記事ページに出力する便利な関数「get_the_term_list」と「get_the_terms」

当ブログもそうですが大抵の 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の方が汎用性がありますね。

この記事が気に入ったら
いいね!してね♪

Twitter で

7 thoughts on “カスタムタクソノミーをカテゴリーのように記事ページに出力する便利な関数「get_the_term_list」と「get_the_terms」

  1. 岡本

    はじめまして、岡本と申します。

    ただいま、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 “”;
    }

    で表示させると、実際に投稿記事を作成しているものについては
    表示されますが、タームを設定しただけで記事を持たないものに
    ついては表示されない状態になっております。

    結論を述べると、
     タクソノミーは、記事作成の有無によらず設定したものをすべて取得
     タームは、記事作成の有無で取得できる/できないの差が出ている。
    といった状態です。

    記事作成の有無によらず、タームをすべて取得する方法はございませんでしょうか?

    不躾な質問で失礼は承知しておりますが、ご指南いただければ幸いでございます。

    1. himecas Post author

      岡本さん、はじめまして^^

      指定したタクソノミーのタームの名前をすべて出力したいということだと思いますが、get_termsの引数にhide_empty=0を追加することで記事が存在しないターム情報も取得できます。

      すごく簡単なコードですが、以下のようにすればすべてのターム名が出力されますのでお試しください。


      $terms = get_terms( 'タクソノミー名', 'hide_empty=0' );
      foreach ( $terms as $term ) {
      echo $term->name;
      }

      あとはお好みで整えていただければと思います。

      1. 岡本

        himecas先生

        岡本です。
        早々のご回答ありがとうございます。
        早速試してみたところ、期待通りの結果が得られました。

        サイト上の登録フォームにて、
        カスタム分類、カテゴリを連動式にして選択項目を
        設けるために、本件を解決したいことが意図でした。

        同じように悩んでいる人もいらっしゃるかもなので
        本件の結論を以下にまとめておきます。

        ■get_terms($args)関数

         argument:’hide_empty’

         投稿記事のないタクソノミーを取得しない時 true(1)、
         取得する時、false(0)、を指定する。
         デフォルトはtrue(1)。

        ですね。

        完全に私の確認不足ですね、お手間かけて申し訳ございません。
        また一つ勉強になりました。
        どうもありがとうございます。

        1. himecas Post author

          岡本さん、コメントありがとうございます。
          まとめていただいた通りで、hide_emptyで取得するタームを操作します。
          解決できてよかったですね。先生だなんてとんでもないです^^;

  2. 花井

    初めまして、花井と申します。

    カスタム投稿&カスタム分類を使用するにあたって、解決出来ない点があり、質問させて頂きました。

    により、ターム別のアーカイブページにリンク付きのターム名(アーカイブが属するターム名)を表示させる事は出来るのですが、同じカスタム投稿タイプ内の全てのターム名をリンク付きで表示させるにはどうすれば良いでしょうか?

    現在のこの様に記述しています。

  3. 花井

    追記

    記事が属しているカスタムタクソノミーの全てのターム名をリンク付きで取得したいのですが、どのように記述すれば良いでしょうか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です