has_category()とは?使い方・使いどころを解説【WordPress中級者向け】

Contents
はじめに:カテゴリー判定、どうしてますか?
WordPressでテーマをカスタマイズしていると、「この投稿が特定のカテゴリーに属しているかどうかを判定したい」という場面がよくあります。
たとえば、特定のカテゴリだけ装飾を変えたり、表示する内容を変えたり……。
そんなときに活躍するのが、has_category()
というテンプレートタグです。
この記事では、has_category()
の基本的な使い方から、実践的なコード例、そしてよくある注意点までを解説していきます。
has_category()とは?
has_category()
は、投稿が指定したカテゴリーに属しているかを判定するためのテンプレートタグです。
似た関数にin_category()
がありますが、has_category()
はループの外でも使えるため、より汎用性の高い関数といえます。
in_category()
については、WordPressのin_category()関数とは?使い方とis_category()との違いを解説【自作テーマ向け】で詳しく説明しています。
基本的な使い方
シンタックス(構文)
has_category( $category, $post )
$category
:チェックしたいカテゴリのスラッグ、ID、名前、またはそれらの配列$post
(省略可):チェック対象の投稿IDまたは投稿オブジェクト。省略時は現在の投稿。
使用例①:スラッグで判定
if ( has_category( 'news' ) ) {
echo 'この投稿は「news」カテゴリーに属しています。';
}
使用例②:複数カテゴリを判定
if ( has_category( array( 'news', 'event' ) ) ) {
echo 'この投稿は「news」または「event」カテゴリーに属しています。';
}

実践的なコード例
投稿に特定のクラスを追加する
<article <?php post_class( has_category('news') ? 'news-post' : '' ); ?>>
カスタムループ内でカテゴリー判定
$query = new WP_Query( array( 'post_type' => 'post' ) );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
if ( has_category( 'special' ) ) {
echo '<div class="highlight">特別記事</div>';
}
endwhile;
wp_reset_postdata();
endif;

注意点:ループ外で使う場合は投稿IDが必要
ループの外で使用する場合は、対象となる投稿のIDまたはオブジェクトを明示的に渡す必要があります。
$post_id = 123;
if ( has_category( 'news', $post_id ) ) {
echo 'この投稿はnewsカテゴリーです。';
}
渡し忘れると、意図しない結果になるので注意が必要です。
has_category()とin_category()の違い・使い分け
比較項目 | has_category() | in_category() |
---|---|---|
使用場所 | ループ内・外どちらも可 | 主にループ内 |
引数の指定方法 | ID / スラッグ / 名前 / 配列 | 同じ |
対象投稿の指定 | 任意の投稿を指定可能 | グローバル投稿が対象 |
個別投稿ページなど、ループ外で条件分岐をしたい場合はhas_category()
を使うと柔軟に対応できます。
まとめ
has_category()
は、投稿が特定のカテゴリに属しているかどうかを判定する関数in_category()
との違いは「ループ外でも使える」点- カスタムループや条件分岐で大活躍
- ループ外で使うときは投稿IDの指定を忘れずに
公式リファレンスリンク
has_category() – WordPress Developer Resources
このように、has_category()
を使えばテーマカスタマイズの幅が広がります。ぜひ実装に取り入れてみてください。