【WordPress】記事の件数を取得・表示する方法|wp_count_posts・カテゴリ別・カスタム投稿タイプ別まで完全解説

【WordPress】記事の件数を取得・表示する方法|wp_count_posts・カテゴリ別・カスタム投稿タイプ別まで完全解説 WordPress

WordPressでサイトの記事数をフロントエンドに表示したい、あるいはテーマ内で条件分岐に使いたい場面は意外と多いものです。「全体で何記事あるか」「このカテゴリに何件あるか」「カスタム投稿タイプの公開件数は?」など、用途はさまざまです。

この記事では、WordPressで記事の件数を取得・表示するすべての方法を目的別に整理し、コピペで使えるコード付きで解説します。

この記事で分かること

  • wp_count_posts() で投稿・固定ページ・カスタム投稿の件数を取得する方法
  • カテゴリ別・タグ別の記事件数を取得する方法
  • 著者(ユーザー)別の投稿数を取得する方法
  • WP_Queryの found_posts で検索結果の件数を取得する方法
  • 記事数をショートコード化してエディタから表示する方法
  • ステータス別(下書き・予約投稿・レビュー待ち)のカウント方法
スポンサーリンク

wp_count_posts() で記事の件数を取得する【基本】

WordPressで記事数を取得する最も基本的な関数がwp_count_posts()です。ステータス別のオブジェクトを返すため、公開済み・下書き・予約投稿など条件を指定して件数を取得できます。

公開済み記事の件数を表示する

PHP — 公開済み投稿の件数を表示

<?php
$count_posts = wp_count_posts();
$published   = $count_posts->publish;
echo '記事数: ' . $published;
?>

▼ 出力例

記事数: 150

wp_count_posts()は引数なしで呼び出すと投稿(post)のステータス別カウントを返します。publishプロパティで公開済みの件数が取得できます。カスタム投稿タイプでの件数取得やWP_Queryを使った複雑な条件指定については、「WP_Queryで複雑な条件検索を実装する方法」も合わせて参照してください。

ステータス別に件数を取得する

wp_count_posts()が返すオブジェクトには、各ステータスのプロパティがあります。

プロパティ ステータス 説明
publish公開済みフロントエンドに表示されている記事
draft下書き未公開の下書き記事
pendingレビュー待ち公開前の承認待ち記事
future予約投稿公開日時を未来に設定した記事
private非公開管理者のみ閲覧可能な記事
trashゴミ箱削除待ちの記事

PHP — ステータス別に件数を表示

<?php
$count = wp_count_posts();

echo '公開済み: '    . $count->publish . '<br>';
echo '下書き: '      . $count->draft   . '<br>';
echo 'レビュー待ち: ' . $count->pending . '<br>';
echo '予約投稿: '    . $count->future  . '<br>';
?>

固定ページの件数を取得する

PHP — 固定ページの件数

<?php
// 第1引数に投稿タイプを指定
$count_pages = wp_count_posts( 'page' );
echo '固定ページ数: ' . $count_pages->publish;
?>

カスタム投稿タイプの件数を取得する

カスタム投稿タイプ(CPT)を使っている場合も、wp_count_posts()の第1引数にタイプ名を渡すだけで件数が取得できます。メインループの仕組みと組み合わせれば、アーカイブページでの表示も簡単です(参考: 「メインループの基本」)。

PHP — カスタム投稿タイプの件数

<?php
// カスタム投稿タイプ 'news' の公開件数
$count_news = wp_count_posts( 'news' );
echo 'ニュース記事数: ' . $count_news->publish;

// 投稿 + 固定ページ + カスタム投稿の合計
$total = wp_count_posts()->publish
       + wp_count_posts( 'page' )->publish
       + wp_count_posts( 'news' )->publish;
echo '全コンテンツ数: ' . $total;
?>

カテゴリ別・タグ別の記事件数を取得する

特定カテゴリの件数を取得する

PHP — カテゴリIDから件数を取得

<?php
// カテゴリIDを指定して件数を取得
$category = get_category( 5 ); // カテゴリID: 5
echo $category->name . ': ' . $category->count . '件';
?>

カテゴリ一覧にそれぞれの件数を表示する

PHP — カテゴリ一覧 + 件数表示

<?php
$categories = get_categories( array(
    'hide_empty' => true, // 記事がないカテゴリは除外
) );

foreach ( $categories as $cat ) {
    echo '<li>' . $cat->name . ' (' . $cat->count . '件)</li>';
}
?>

カテゴリ一覧の表示方法について詳しくは「WordPressでカテゴリ一覧に記事数を表示する方法」で解説しています。

タグの件数を取得する

PHP — タグ別の件数を取得

<?php
// タグスラッグで件数を取得
$tag = get_term_by( 'slug', 'php', 'post_tag' );
if ( $tag ) {
    echo $tag->name . ': ' . $tag->count . '件';
}

// 現在のアーカイブページのターム件数
$term = get_queried_object();
echo $term->name . ': ' . $term->count . '件';
?>

カスタムタクソノミー別の件数を取得する

カテゴリやタグ以外に独自のカスタムタクソノミー(例: 「地域」「難易度」など)を使っている場合も、同じ仕組みで件数を取得できます。

PHP — カスタムタクソノミーの件数を取得

<?php
// カスタムタクソノミー 'difficulty' の特定タームの件数
$term = get_term_by( 'slug', 'beginner', 'difficulty' );
if ( $term ) {
    echo $term->name . ': ' . $term->count . '件';
}

// カスタムタクソノミーの全ターム一覧と件数
$terms = get_terms( array(
    'taxonomy'   => 'difficulty',
    'hide_empty' => true,
) );

foreach ( $terms as $t ) {
    echo '<li>' . $t->name . ' (' . $t->count . '件)</li>';
}
?>

get_terms() のポイント

get_terms()はカテゴリ・タグ・カスタムタクソノミーすべてに使える汎用的な関数です。taxonomy引数にタクソノミー名を指定し、hide_emptyで空のタームを除外できます。
WordPress 4.5以降は配列形式の引数が推奨されています。

著者(ユーザー)別の投稿数を取得する

PHP — 著者別の投稿数

<?php
// ユーザーIDを指定して投稿数を取得
$user_post_count = count_user_posts( 1 ); // ユーザーID: 1
echo '投稿数: ' . $user_post_count;

// カスタム投稿タイプを指定する場合
$news_count = count_user_posts( 1, 'news' );

// 現在のログインユーザーの投稿数
$current_user = get_current_user_id();
$my_count     = count_user_posts( $current_user );
?>

WP_Query の found_posts で件数を取得する

カスタムクエリで条件に一致した件数を取得したい場合は、WP_Queryfound_postsプロパティが便利です。ページネーションの総件数としても利用できます。

PHP — WP_Query で条件付き件数を取得

<?php
$query = new WP_Query( array(
    'post_type'      => 'post',
    'category_name'  => 'wordpress',
    'posts_per_page' => 1,  // 件数だけ知りたい場合は1でOK
) );

echo '検索結果: ' . $query->found_posts . '件';

wp_reset_postdata();
?>

found_posts と post_count の違い

found_postsは条件に一致する全件数(ページネーション前の総数)を返します。
post_count現在のページの件数(posts_per_pageで制限された数)を返します。
WP_Queryの詳しい使い方は「WP_Queryで複雑な条件検索を実装する方法」で解説しています。

メインクエリの件数を取得する($wp_query)

アーカイブページや検索結果ページなど、WordPressのメインクエリの件数を取得する場合は、グローバル変数$wp_queryを使います。

PHP — アーカイブページ・検索結果の件数

<?php
global $wp_query;

// 検索結果ページで「〇件見つかりました」と表示
if ( is_search() ) {
    echo '「' . get_search_query() . '」の検索結果: '
       . $wp_query->found_posts . '件';
}

// カテゴリアーカイブで件数を表示
if ( is_category() ) {
    echo single_cat_title( '', false )
       . ': ' . $wp_query->found_posts . '件';
}
?>

メインループの仕組みについて詳しくは「メインループを使って記事をループで処理して表示する方法」を参照してください。

記事数をショートコード化して表示する

記事本文やウィジェットから記事数を表示したい場合は、ショートコードを作成すると便利です。以下のコードをfunctions.phpに追加します。

functions.php — 記事数表示ショートコード

// [post_count] で公開記事数を表示
// [post_count type="page"] で固定ページ数
// [post_count type="news"] でカスタム投稿数
// [post_count category="wordpress"] でカテゴリ別件数
// [post_count status="draft"] で下書き件数
function codingls_post_count_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'type'     => 'post',
        'category' => '',
        'status'   => 'publish',
    ), $atts );

    // カテゴリ指定がある場合は WP_Query で取得
    if ( ! empty( $atts['category'] ) ) {
        $q = new WP_Query( array(
            'post_type'      => $atts['type'],
            'category_name'  => $atts['category'],
            'post_status'    => $atts['status'],
            'posts_per_page' => 1,
        ) );
        $result = $q->found_posts;
        wp_reset_postdata();
        return $result;
    }

    $count = wp_count_posts( $atts['type'] );
    $status = $atts['status'];
    return isset( $count->$status ) ? $count->$status : 0;
}
add_shortcode( 'post_count', 'codingls_post_count_shortcode' );

▼ エディタでの使用例

当サイトの記事は [post_count] 件です。
固定ページは [post_count type=”page”] ページあります。
WordPress カテゴリの記事数: [post_count category=”wordpress”] 件
下書き記事数: [post_count status=”draft”] 件

REST API で記事件数を取得する(外部連携向け)

WordPressのREST APIを使えば、外部のアプリケーションやJavaScriptからも記事件数を取得できます。レスポンスヘッダーのX-WP-Totalに総件数が含まれます。

JavaScript — REST API で件数を取得

// REST API のレスポンスヘッダーから件数を取得
const response = await fetch(
  '/wp-json/wp/v2/posts?per_page=1'
);

// X-WP-Total: 全記事数
const totalPosts = response.headers.get( 'X-WP-Total' );

// X-WP-TotalPages: 総ページ数
const totalPages = response.headers.get( 'X-WP-TotalPages' );

console.log( '記事数:', totalPosts );
console.log( 'ページ数:', totalPages );
ヘッダー名 内容
X-WP-Total条件に一致する全投稿数150
X-WP-TotalPagesper_page で割った総ページ数15

REST APIを使った外部連携について詳しくは「WordPress REST APIの使い方」を参照してください。per_page=1を指定することで、実際のデータ転送量を最小限にしつつ件数のみを効率的に取得できます。

方法の選び方ガイド

取得したい内容 使う関数・方法 特徴
投稿全体の公開件数wp_count_posts()最もシンプル・軽量
固定ページ / カスタム投稿の件数wp_count_posts('type')投稿タイプを引数で指定
カテゴリ / タグ別の件数get_category()->countタームオブジェクトから直接取得
著者別の投稿数count_user_posts()ユーザーID指定で取得
条件付きの件数(複合条件)WP_Query->found_posts柔軟だがやや重い
メインクエリの件数$wp_query->found_posts追加クエリ不要
エディタから記事数を挿入ショートコードテーマファイル編集不要
外部アプリ・JSから件数取得REST API X-WP-TotalヘッドレスWP・SPA向け

パフォーマンスの注意点

wp_count_posts() vs WP_Query の使い分け

wp_count_posts()は内部的にキャッシュされるため、同一リクエスト内で何度呼び出しても追加のSQLは発行されません。単純なステータス別カウントにはこちらを使いましょう。

WP_Queryは複雑な条件指定が可能ですが、その分SQLが重くなります。件数だけ知りたい場合はposts_per_page => 1を指定し、実データの取得を最小限にするのがコツです。

サイドバーなどで件数を頻繁に表示する場合は、Transient APIでキャッシュすると負荷を軽減できます。

PHP — Transient API で件数をキャッシュする例

<?php
$count = get_transient( 'site_post_count' );

if ( $count === false ) {
    // キャッシュがなければ取得して1時間キャッシュ
    $count = wp_count_posts()->publish;
    set_transient( 'site_post_count', $count, HOUR_IN_SECONDS );
}

echo '記事数: ' . $count;
?>

Transientキャッシュを使う場合は、記事が公開・更新された際にキャッシュをクリアしないとデータが古いままになります。以下のようにsave_postフックでキャッシュを自動削除しましょう。

functions.php — 記事の保存時にキャッシュをクリア

// 記事の公開・更新時に件数キャッシュを削除
function codingls_clear_post_count_cache( $post_id ) {
    // 自動保存はスキップ
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    delete_transient( 'site_post_count' );
}
add_action( 'save_post', 'codingls_clear_post_count_cache' );

よくある質問(FAQ)

Q. wp_count_posts()で取得できる情報は何ですか?
A. wp_count_posts()は各投稿ステータス(publish, draft, trash等)ごとの件数をオブジェクトで返します。例えば$counts = wp_count_posts(); $published = $counts->publish; で公開済みの件数を取得できます。
Q. カテゴリー別の記事数を表示するにはどうすればいいですか?
A. get_category()でカテゴリーオブジェクトを取得し、countプロパティにアクセスします。WP_Queryで絞り込んで found_postsを使う方法もあります。
Q. カスタム投稿タイプの件数を取得するには?
A. wp_count_posts(‘カスタム投稿タイプ名’)と引数を指定します。またはWP_Queryでpost_type指定のクエリを実行し$query->found_postsで取得する方法もあります。

まとめ

WordPress 記事件数取得のポイント

✅ 基本は wp_count_posts() で投稿タイプ別に取得(軽量・キャッシュ付き)
✅ カテゴリ・タグ別は get_category()->count で直接取得
✅ 著者別は count_user_posts() でユーザーID指定
✅ 複雑な条件は WP_Query の found_posts で柔軟に対応
✅ 外部連携は REST API の X-WP-Total ヘッダーで取得
✅ エディタから使うなら ショートコード化 が便利

記事の件数取得は、用途に応じて最適な関数が異なります。シンプルな全件カウントならwp_count_posts()、条件付きならWP_Queryと使い分けてみてください。

関連記事として、ページネーションの実装は「プラグインなしのページネーション実装方法」、人気記事ランキングの表示は「プラグインなしで人気記事ランキングを表示する方法」も参考にしてください。