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; ?>
▼ 出力例
wp_count_posts()は引数なしで呼び出すと投稿(post)のステータス別カウントを返します。publishプロパティで公開済みの件数が取得できます。カスタム投稿タイプでの件数取得やWP_Queryを使った複雑な条件指定については、「WP_Queryで複雑な条件検索を実装する方法」も合わせて参照してください。
ステータス別に件数を取得する
wp_count_posts()が返すオブジェクトには、各ステータスのプロパティがあります。
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_Queryのfound_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 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 );
REST APIを使った外部連携について詳しくは「WordPress REST APIの使い方」を参照してください。per_page=1を指定することで、実際のデータ転送量を最小限にしつつ件数のみを効率的に取得できます。
方法の選び方ガイド
パフォーマンスの注意点
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)
まとめ
WordPress 記事件数取得のポイント
wp_count_posts() で投稿タイプ別に取得(軽量・キャッシュ付き)
get_category()->count で直接取得
count_user_posts() でユーザーID指定
記事の件数取得は、用途に応じて最適な関数が異なります。シンプルな全件カウントならwp_count_posts()、条件付きならWP_Queryと使い分けてみてください。
関連記事として、ページネーションの実装は「プラグインなしのページネーション実装方法」、人気記事ランキングの表示は「プラグインなしで人気記事ランキングを表示する方法」も参考にしてください。

