投稿に設定したカテゴリーをテーマのテンプレートに出したいとき、WordPress では the_category() と get_the_category() という2つの関数がよく使われます。名前は似ていますが、片方は「カテゴリーをリンク付きで表示する」関数、もう片方は「カテゴリーの情報を取得する」関数で、役割がはっきり分かれています。この違いを知らないと、画面に何も出ない・配列がそのまま表示されてしまう、といったつまずきにつながります。この記事では、2つの関数の違いと基本の使い方、取得したデータから自前でリンクを組み立てる実践例まで、テンプレートにそのまま貼れるコード付きで解説します。テーマを自作している初心者〜中級者の方が対象です。
目次
「表示する」関数と「取得する」関数
まず押さえておきたいのが、2つの関数の役割の違いです。the_category() は投稿のカテゴリーをリンク付きの HTML として画面に出力(echo)する関数です。一方 get_the_category() は、カテゴリーの情報をオブジェクトの配列として取得(return)する関数で、それ自体は何も表示しません。取得したデータを使って、表示する HTML は自分で組み立てます。
| 関数 | 動作 | 戻り値 |
|---|---|---|
the_category() | カテゴリーをリンク付きで表示(echo) | なし(直接出力) |
get_the_category() | カテゴリーの情報を取得(return) | WP_Term オブジェクトの配列 |
WordPress の関数には、頭に the_ が付くものと get_the_ が付くものがペアで用意されていることが多くあります。ざっくり言うと the_ 系は「その場で表示する」、get_the_ 系は「値を取得して返す」という命名の決まりです。カテゴリーの関数もこのルールに沿っているので、そのまま出したいなら the_category()、加工したいなら get_the_category() と覚えておくと迷いません。
the_category() でカテゴリーを表示する
もっとも手軽なのが the_category() です。ループの中で呼び出すだけで、その投稿に設定されたカテゴリーが、アーカイブページへのリンク付きで出力されます。複数のカテゴリーが設定されている場合は、それぞれがリンクとして並びます。
<?php
// ループ内で投稿のカテゴリーをリンク付きで表示する
the_category();
?>
引数を渡さない場合、複数カテゴリーの区切りは WordPress が自動で行います(既定では改行を含む形で出力されます)。区切り文字を自分で指定したいときは、第1引数に区切り文字列を渡します。たとえばカンマ区切りで横並びにしたいなら、次のように書きます。
<?php
// カテゴリーを「, 」区切りで表示する(例: PHP, WordPress)
the_category( ', ' );
?>
the_category() はリンクの HTML までまとめて作ってくれるので、「カテゴリーをそのまま表示できればいい」という場面ではこれが一番手早い方法です。逆に、リンクの形を自由に変えたい・class を付けたい・アイコンを添えたい、といった細かいカスタマイズには向きません。そうした用途では次に紹介する get_the_category() を使います。
get_the_category() でカテゴリー情報を取得する
get_the_category() は、投稿に設定されたカテゴリーを WP_Term オブジェクトの配列として返します。表示はしないので、返ってきた配列を foreach で回し、必要なプロパティ(カテゴリー名や ID など)を取り出して使います。次は、カテゴリー名だけを順番に表示する例です。
<?php
// 投稿のカテゴリーを配列で取得する
$categories = get_the_category();
// カテゴリー名を一つずつ表示する
foreach ( $categories as $category ) {
echo esc_html( $category->name ) . ' ';
}
?>
$category->name のように、各オブジェクトのプロパティへアクセスして値を取り出します。出力する際は esc_html() でエスケープしておくと安全です。配列で返るため、カテゴリーが1つも設定されていない投稿では空配列になります。表示前に if ( ! empty( $categories ) ) などで中身があるか確認しておくと、より堅牢です。
WP_Term オブジェクトの主なプロパティ
get_the_category() が返す各要素は WP_Term オブジェクトで、カテゴリーに関するさまざまな情報を持っています。よく使うプロパティは次のとおりです。
| プロパティ | 意味 |
|---|---|
term_id | カテゴリー(ターム)の ID |
cat_ID | カテゴリー ID(term_id と同じ値。カテゴリー専用の別名) |
name | カテゴリー名(画面に表示される名前) |
slug | スラッグ(URL に使われる識別子) |
description | カテゴリーの説明文 |
parent | 親カテゴリーの ID(なければ 0) |
count | そのカテゴリーに属する投稿数 |
term_id と cat_ID は同じ値を返します。cat_ID はカテゴリー向けに用意された別名なので、どちらを使っても構いませんが、カテゴリー以外のタクソノミーでも通用する term_id を使っておくと汎用的です。次に紹介する自前リンクの組み立てでは、この term_id を使います。
get_category_link() で自前のリンクを作る
get_the_category() でカテゴリーの ID を取得できたら、get_category_link( $term_id ) でそのカテゴリーのアーカイブページの URL を取得できます。これを組み合わせれば、the_category() と同じくリンク付きの表示を、自分の好きな HTML 構造で作れます。class を付けたり、独自のマークアップで囲んだりと、見た目を自由に調整したいときに役立ちます。
<?php
$categories = get_the_category();
if ( ! empty( $categories ) ) {
foreach ( $categories as $category ) {
// カテゴリーのアーカイブ URL を取得する
$url = get_category_link( $category->term_id );
?>
<a class="cat-link" href="<?php echo esc_url( $url ); ?>">
<?php echo esc_html( $category->name ); ?>
</a>
<?php
}
}
?>
このように get_the_category() で情報を取り出し、get_category_link() で URL を作って自分で <a> タグを組み立てれば、リンクの class やラベルを完全に制御できます。URL は esc_url()、カテゴリー名は esc_html() でエスケープしておくのが基本です。the_category() では手が届かないデザイン要件があるときは、この組み合わせが定番のやり方になります。
ループの外で使うときは投稿IDを渡す
これらの関数は、基本的にはループ(The Loop)の中で使うことを前提にしています。ループ内であれば「いま処理している投稿」が分かるため、引数なしでもその投稿のカテゴリーを扱えます。single.php や index.php の while ( have_posts() ) の中で呼び出すのが基本形です。
一方、ループの外(サイドバーやウィジェット、特定の投稿IDを指定して情報を取りたい場面など)で使うときは、対象の投稿が分からないため、get_the_category() に投稿IDを引数として渡します。次は、ID が 123 の投稿のカテゴリーを取得する例です。
<?php
// 投稿ID 123 のカテゴリーを取得する
$categories = get_the_category( 123 );
foreach ( $categories as $category ) {
echo esc_html( $category->name ) . ' ';
}
?>
このように投稿IDを渡せば、ループの外でも任意の投稿のカテゴリーを取得できます。the_category() にも第3引数で投稿IDを渡せますが、ループ外で柔軟に扱うなら、情報を取得してから自分で表示を組み立てられる get_the_category() のほうが扱いやすいでしょう。
カテゴリーが表示されないとき
ループの外で引数なしで呼び出している
ループの外で the_category() や引数なしの get_the_category() を使うと、「いまの投稿」が定まらないため、意図したカテゴリーが取得できません。何も表示されない・別の投稿のカテゴリーが出る、といった症状が出たら、ループの中で呼んでいるか、ループ外なら投稿IDを渡しているかを確認しましょう。
get_the_category() の戻り値をそのまま echo している
get_the_category() は配列を返すため、echo get_the_category(); のように直接出力しようとすると、カテゴリー名は表示されず Array という文字列が出たり、PHP の警告が出たりします。表示したいのか取得したいのかを切り分け、表示なら the_category()、取得して加工するなら foreach でプロパティを取り出す、という使い分けを徹底すれば防げます。
投稿にカテゴリーが設定されていない
そもそも投稿にカテゴリーが付いていなければ、get_the_category() は空配列を返し、the_category() も何も出力しません。カスタム投稿タイプでカテゴリー(タクソノミー)を有効にしていないケースもよくあります。表示されないときは、投稿側にカテゴリーが設定されているか、対象の投稿タイプがそのタクソノミーに対応しているかも確認してみてください。
まとめ
the_category() と get_the_category() は、投稿のカテゴリーを扱う基本の関数です。要点を振り返ります。
the_category()はカテゴリーをリンク付きで表示(echo)する。区切り文字はthe_category( ', ' )のように引数で指定できるget_the_category()はWP_Termオブジェクトの配列を取得(return)する。foreachでnameやterm_idを取り出して使う- 自前でリンクを作るときは
get_category_link( $term_id )でアーカイブ URL を取得し、<a>を組み立てる - 基本はループ内で使う。ループ外では
get_the_category( $post_id )のように投稿IDを渡す
「そのまま出したいなら the_category()、加工したいなら get_the_category()」という基準で選べば、カテゴリーの表示で迷うことはなくなります。まずは the_category( ', ' ) で表示できることを確認し、デザインを凝りたくなったら get_the_category() と get_category_link() の組み合わせに進むとスムーズです。