wordpressで表示する記事数をしぼる方法
一覧ページで表示する記事数を絞ろうとした時にどうやって件数って変更するのかどうかパッと出てこなかったのでメモ
メインループ:if (have_posts())~
メインループの「if (have_posts())~」だと「query_posts」使って下記のようにすれば表示件数とか変えられるのだが非推奨なので辞めとく
どうも「query_posts」を使うとメインクエリを上書きするのでページャーとかに予期しない影響が出たりするみたい。
// ×「query_posts」非推奨
<?php query_posts( 'posts_per_page=5' );
if (have_posts()) : while (have_posts()) : the_post(); ?>
// ループさせるもの
<?php endwhile; else : ?>
<?php endif; ?>
なので、どうしてもメインループ「if (have_posts())~」を使って表示件数を変えたいときは、function.phpに以下のように追加
function my_pre_get_posts( $query ) {
if ( is_admin() || ! $query -> is_main_query() ) return;
if ( $query->is_home ) {
$query->set( 'posts_per_page', '6' );
$query->set( 'orderby', 'rand' );
}
if ( $query -> is_archive() ) {
$query -> set( 'posts_per_page', '5' );
}
}
add_action( 'pre_get_posts', 'my_pre_get_posts' );
「pre_get_posts」はwrodpress側で用意されているアクションフックと呼ばれているものらしく、「query_posts(非推奨)」と同じでメインクエリーを上書きするらしいけどDBのアクセスが少ないらしくて効率的らしい。
でも、ぶっちゃけ記事数を制御するならサブループの「WP_Query」か「get_posts」を使うのが1番いいみたい。楽だし。
サブループ:new WP_Query($args);
<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
// ループするもの
<?php endwhile; ?>
<?php else: ?>
// 何もなかったら
<?php endif; ?>
調べてて知ったけど「get_option(‘posts_per_page’)」を使えば、wordpressの「設定」→「表示設定」の「1ページに表示する最大投稿数」に入ってる設定を取得できるらしい
知らんかった
// 「表示設定」の「1ページに表示する最大投稿数」を設定できる
'posts_per_page' => get_option('posts_per_page'),
サブループ:get_posts
<?php
$the_query = get_posts( array(
'post_type' => 'post',
'posts_per_page' => 10,
));
if( $the_query ):
?>
<?php
foreach( $the_query as $post ):
setup_postdata( $post );
?>
// ループするもの
<?php endforeach; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
// 何もなかったら
<?php endif; ?>
ぶっちゃけあんま使ったことない
まとめ
基本的にメインループでいけるならメインループを使うべきだけど、表示件数とか変えたいときはサブループ「WP_Query」「get_posts」のどちらかを使った方がいいみたい。
サブループ「WP_Query」「get_posts」のどちらを使えばいいんだ!ってなった時は、「WP_Query」のほうが取得できる情報量が多いいらしいし、ループも「have_posts()」使うのでメインループと似た部分もあるのでわかりやすいから個人的には「WP_Query」がいいかな
以下のサイトが参考になりました。
▼WordPressで押さえておきたい!get_posts,WP_Query,query_posts の違いと用例
https://www.m-hand.co.jp/program/4119/
▼WordPressのメインクエリやメインループとは?サブとの違いは何か?
https://www.1-firststep.com/archives/2375