Go to top Go to bottom

投稿が分類されているカテゴリーを取得するには、get_the_category()を使用します。戻ってくる値はカテゴリーの配列です。

投稿が分類されているカテゴリーを配列で取得する

投稿が分類されているカテゴリーを配列で取得するには次のようにします。

<?php $categories = get_the_category(); ?>

この関数は引数に投稿のIDを渡せば、WordPressループの外でも使うことができます。IDを指定しない場合は、現在の投稿が使われれます。

この関数はWP Termオブジェクトの配列を返します。ログで出力すると、例えば次のような結果が得られます。

array (
  0 => 
  WP_Term::__set_state(array(
     'term_id' => 4,
     'name' => '写真',
     'slug' => 'photo',
     'term_group' => 0,
     'term_taxonomy_id' => 4,
     'taxonomy' => 'category',
     'description' => '',
     'parent' => 0,
     'count' => 5,
     'filter' => 'raw',
     'cat_ID' => 4,
     'category_count' => 5,
     'category_description' => '',
     'cat_name' => '写真',
     'category_nicename' => 'photo',
     'category_parent' => 0,
  )),
  1 => 
  WP_Term::__set_state(array(
     'term_id' => 6,
     'name' => '日常',
     'slug' => '%e6%97%a5%e5%b8%b8',
     'term_group' => 0,
     'term_taxonomy_id' => 6,
     'taxonomy' => 'category',
     'description' => '',
     'parent' => 4,
     'count' => 1,
     'filter' => 'raw',
     'cat_ID' => 6,
     'category_count' => 1,
     'category_description' => '',
     'cat_name' => '日常',
     'category_nicename' => '%e6%97%a5%e5%b8%b8',
     'category_parent' => 4,
  )),
)

WP Termオブジェクトはカテゴリに関するあらゆる情報をもっているので、カテゴリについて行いたいことのほとんどは実現が可能になると思います。中でも、4行目のterm_id(カテゴリーのID)、5行目のname(カテゴリーの名前)、12行目のcount(カテゴリーに属している投稿の数)はよく使用します。

WP Termクラス

カテゴリーもタグも(そしてカスタムタクソノミーも)、すべてWP Termクラスのインスタンスです。カテゴリーとタグは、階層構造を持つか持たないかの違いしかありません。またカテゴリーもタグもタクソノミーの一部で、カテゴリーは単にタクソノミーの名前が”category”であること、初期状態で有効になっていることなどの違いしかありません。

カテゴリの配列を用いた例

カテゴリの配列を用い、the_category()では実現できない例をいくつか示してみます。

カテゴリの名前だけを一覧する

the_category()は必ずリンク付きで表示されてしまうので、名前だけを表示してみたいと思います。

<?php 
  $categories = get_the_category();
  foreach ( $categories as $category ) {
    echo '<span>' . $category->name . '</span>';
  }
?>

出力すると「写真日常風景」のようになりますので、間をあける場合はcssを用います。もしセパレータを入れたい場合は、たとえば次のようにします。

<?php
  $html       = '';
  $separator  = '<span> / </span>';
  $categories = get_the_category();

  foreach ( $categories as $category ) {
    $html .= '<span>' . $category->name . '</span>' . $separator;
  }

  $html = rtrim( $html, $separator );

  echo $html;
?>

区切り文字を変えるには2行目の$separatorの値を変更してください。なお、10行目のrtrim( $html, $separator );は、一番右に余分に出力されるセパレータを取り除く処理です。

投稿が属するカテゴリーのリンクを1つだけ表示する

the_category()では投稿が所属するカテゴリーをすべて表示しますが、1つだけ表示したい場合は次のようにします。

<?php
  $categories = get_the_category();
  if ( !empty( $categories ) ) {
    printf(
      '<a href="%s">%s</a>',
      get_category_link( $categories[0]->term_id ),
      $categories[0]->name
    );
  }
?>

$categories[0]で配列の最初の要素のみを取得しています。4行目以降は、Codexのサンプル

echo '<a href="' . get_category_link( $category[0]->term_id ) . '">' . $category[0]->cat_name . '</a>';

のように、echoを用いて文字列を出力しても構いません。

なお、get_category_link()はカテゴリーのIDを引数に渡すと、カテゴリーアーカイブへのURLを返す関数です。