1. ホーム
  2. WordPress

【WordPress】get_the_category と the_category の使い方|投稿のカテゴリーを取得・表示する方法

Share

投稿に設定したカテゴリーをテーマのテンプレートに出したいとき、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() です。ループの中で呼び出すだけで、その投稿に設定されたカテゴリーが、アーカイブページへのリンク付きで出力されます。複数のカテゴリーが設定されている場合は、それぞれがリンクとして並びます。

single.php
<?php
// ループ内で投稿のカテゴリーをリンク付きで表示する
the_category();
?>

引数を渡さない場合、複数カテゴリーの区切りは WordPress が自動で行います(既定では改行を含む形で出力されます)。区切り文字を自分で指定したいときは、第1引数に区切り文字列を渡します。たとえばカンマ区切りで横並びにしたいなら、次のように書きます。

single.php
<?php
// カテゴリーを「, 」区切りで表示する(例: PHP, WordPress)
the_category( ', ' );
?>

the_category() はリンクの HTML までまとめて作ってくれるので、「カテゴリーをそのまま表示できればいい」という場面ではこれが一番手早い方法です。逆に、リンクの形を自由に変えたい・class を付けたい・アイコンを添えたい、といった細かいカスタマイズには向きません。そうした用途では次に紹介する get_the_category() を使います。

get_the_category() でカテゴリー情報を取得する

get_the_category() は、投稿に設定されたカテゴリーを WP_Term オブジェクトの配列として返します。表示はしないので、返ってきた配列を foreach で回し、必要なプロパティ(カテゴリー名や ID など)を取り出して使います。次は、カテゴリー名だけを順番に表示する例です。

single.php
<?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_idcat_ID は同じ値を返します。cat_ID はカテゴリー向けに用意された別名なので、どちらを使っても構いませんが、カテゴリー以外のタクソノミーでも通用する term_id を使っておくと汎用的です。次に紹介する自前リンクの組み立てでは、この term_id を使います。

get_category_link() で自前のリンクを作る

get_the_category() でカテゴリーの ID を取得できたら、get_category_link( $term_id ) でそのカテゴリーのアーカイブページの URL を取得できます。これを組み合わせれば、the_category() と同じくリンク付きの表示を、自分の好きな HTML 構造で作れます。class を付けたり、独自のマークアップで囲んだりと、見た目を自由に調整したいときに役立ちます。

single.php
<?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.phpindex.phpwhile ( 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)する。foreachnameterm_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() の組み合わせに進むとスムーズです。

参考ページ