CommentOut

WP_Queryで取得した記事件数を取得する WP_Queryで取得した記事件数を取得する

WP_Queryで取得した記事件数を取得する

公開日:  最終更新日:

私はWordPressで記事件数を表示したい時、毎回「どうやって表示するんだっけ?」って忘れて調べています。そういう人多いんじゃないでしょうか?
頻繁に行う記事一覧の表示とは異なり、件数の表示ってある程度WordPressの機能で表示できちゃうこともあるので、わざわざ表示する処理を書くことが少ないからだと思います。

今回はWP_Queryで取得した記事件数を表示する方法をご紹介します。

WP_Queryの基本処理

一旦、WP_Queryの基本をおさらいします。

<?php
$query_result = new WP_Query(array(
    'post_type'    => 'post',
    'post_status'  => 'publish',
    'orderby'      => 'date',
    'order'        => 'DESC'
)); ?>
if ($query_result->have_posts()): ?>
    <ul class="news_list">
        <?php while($query_result->have_posts()): $query_result->the_post(); ?>
            <li>
                <a class="news_block" href="<?php the_permalink(); ?>">
                    <time><?php echo get_time('Y/m/d'); ?></time>
                    <?php echo get_the_title(); ?>
                </a>
            </li>
        <?php endwhile; ?>
    </ul>
<?php else: ?>
    <?php // 条件に一致する記事が無かった場合 ?>
    <p>現在掲載中のお知らせはありません。</p>
<?php endif; ?>

new WP_Queryで記事一覧の情報を変数に代入します。

<?php
$query_result = new WP_Query(array(
    'post_type'    => 'post',
    'post_status'  => 'publish',
    'orderby'      => 'date',
    'order'        => 'DESC'
)); ?>

引数に記事の取得条件を指定します。

今回の記事では記事の取得条件については扱いません。
もっと詳しい記事の取得条件を知りたい場合はこちらの記事をご確認ください。

そして、変数に代入した記事一覧情報を、if文で記事があるかどうかを判定して、記事情報が入っていれば、while文で回すという流れになります。

<?php
if ($query_result->have_posts()):
    // 条件に一致する記事が1つ以上あった場合
    while($query_result->have_posts()):
        $query_result->the_post();
    endwhile;
else:
    // 条件に一致する記事が1つも無かった場合
endif;
?>

ここで、have_posts()によって、記事情報が取得できたか、取得できていないかはわかるんです。
しかし、何件の記事情報が取得できたかがわからないのです。

近年ではホームページの表示速度が重要視されるため、while文でカウントするなんてナンセンスです。

WP_Queryの記事取得件数を取得するには?

WP_Queryの記事取得結果から、記事件数を取得するにはpost_countを使います。

<?php
$query_result = new WP_Query(array(
    'post_type'    => 'post',
    'post_status'  => 'publish',
    'orderby'      => 'date',
    'order'        => 'DESC'
)); ?>

<p>記事件数:<?php echo $query_result->post_count; ?>件</p>

WP_Queryの結果を代入したクラス変数のメンバ変数post_countを呼び出すことで、記事件数を取得することが可能です。

例えば、記事の有無や記事件数によって、表示を変える場合には、以下のようになります。

<?php
$query_result = new WP_Query(array(
    'post_type'    => 'post',
    'post_status'  => 'publish',
    'orderby'      => 'date',
    'order'        => 'DESC'
));

if ($query_result->have_posts()): ?>
    <p><?php echo $query_result->post_count; ?>件の記事を取得しました。</p>
<?php else: ?>
    <p>該当する記事はありませんでした。</p>
<?php endif; ?>

過去1ヵ月以内に投稿された新着記事の件数を表示する場合

記事件数を表示したい時の例として、1ヵ月以内に投稿された記事件数を表示したい時のプログラムを作成します。

<?php
$query_result = new WP_Query(array(
    'post_type'    => 'post',
    'post_status'  => 'publish',
    'cat'          => get_category_by_slug({カテゴリスラッグ名})->cat_ID,
    'date_query'   => array(array(
        'after'    => date('Y-m-d H:i:s', strtotime("-1 month"))
    ))
));

if ($query_result->have_posts()): ?>
    <p><?php echo $query_result->post_count; ?>件の新着記事があります。</p>
<?php else: ?>
    <p>過去1ヵ月間に投稿された新着記事はありません。</p>
<?php endif; ?>

これで{カテゴリスラッグ名}に過去1ヵ月間に投稿された記事数がわかります。

<?php
$query_result = new WP_Query(array(
    'post_type'    => 'post',
    'post_status'  => 'publish',
    'cat'          => get_category_by_slug({カテゴリスラッグ名})->cat_ID,
    'date_query'   => array(array(
        'after'    => date('Y-m-d H:i:s', strtotime("-1 month"))
    ))
));

これが今回のWP_Queryの記事絞り込み条件です。

'cat' => get_category_by_slug({カテゴリスラッグ名})->cat_ID,

‘cat’は投稿カテゴリーの絞り込みです。
通常、カテゴリーIDを代入するのですが、直接ID番号を入力するとマジックナンバーになってしまいます。
なので、わざわざスラッグ名からカテゴリーオブジェクトを取得して、カテゴリーオブジェクトからカテゴリーIDを引っ張ってきてます。
実行速度が気になる人は、定数でカテゴリーオブジェクトを関連付けてやって、定数を代入するなどでも良いと思います。

'date_query'   => array(array(
    'after'    => date('Y-m-d H:i:s', strtotime("-1 month"))
))

上記のコードでは、投稿日を条件にしています。
‘after’は『ある日付よりも後の投稿日の記事』という条件になります。

そして、date関数を使用しています。

date('Y-m-d H:i:s', strtotime("-1 month"))

date(‘Y-m-d H:i:s’)は現在の日付を指定のフォーマットで返してくる関数です。
そして、第二引数にstrtotime(“-1 month”)。そう1ヵ月前です。

なので、『1ヵ月前よりも後に投稿された記事』をこのコードで条件指定していることになります。

宣伝
WordPressサイトのテンプレート編集やトラブル対応、バグ修正、簡単なJavascriptの作成(カルーセルやバリデーション等)など、小規模なスポット対応を受け付けております。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。

この記事を書いた人

uilou

uilou

プログラマー

基本的に、自分自身の備忘録のつもりでブログを書いています。 自分と同じ所で詰まった人の助けになれば良いかなと思います。 システムのリファクタリングを得意としており、バックエンド、フロントエンド、アプリケーション、SQLなど幅広い知識と経験があります。 広いだけでなく、知識をもっと深堀りしていきたいですね。