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ヵ月前よりも後に投稿された記事』をこのコードで条件指定していることになります。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。