フリーランス|WEB 制作経験丸7年、制作会社様からのご依頼に丁寧・高クオリティでお手伝いいたします。 IRODORI DESIGN

B L O G

【WordPress】メインクエリの表示件数を変更する方法

WordPress
アクションフック
メインクエリ

こんにちは、岐阜・名古屋を拠点に全国各地からご依頼いただくWEBサイトを制作しているフリーランスエンジニアの寺井です。

今回はWordPressのメインクエリで出力件数を変更する方法を解説したいと思います。

メインクエリとサブクエリ

WordPressにはメインクエリ とサブクエリ のふたつのクエリがあります。メインクエリは各ページにつきひとつ、決まったクエリがあります。サブクエリ は自分で取得する内容を決めたうえで出力します。そのためサブクエリの場合は以下の記述で表示件数を指定することが出来ます。

$args = array(
	'posts_per_page' => 5,
);

でもメインクエリの場合、各ページURLによって取得される内容は決まっているので以下の記述でメインクエリの値を取得します。

if( have_posts() ):
	while( have_posts() ):
		the_post();

	endwhile;
endif;
wp_reset_postdata();

メインクエリの場合、通常出力件数は管理画面の「設定」>「表示設定」>「1ページに表示する最大投稿数」で設定した値と連動して出力されます。

メインクエリで表示件数を指定する方法

メインクエリの場合、query_postsを使用して以下のように指定することも可能です。

query_posts('posts_per_page=5');
if( have_posts() ):
	while( have_posts() ):
		the_post();

	endwhile;
endif;
wp_reset_query();

でもquery_postsはメインクエリを書き換えてしまうためバグが発生する可能性があります。またWordPress公式からも非推奨の関数とされていてWP_Queryget_postsを使用するようにと記載があります。

そのため推奨されているメインクエリで表示件数を指定する方法はアクションフックpre_get_postsを使用する方法です。pre_get_postsはメインクエリを制御するためのフックです。
pre_get_postsを以下のように指定して表示件数を指定します。

function my_pre_get_posts( $query ){
	if( is_admin() || !$query->is_main_query() ){
		return;
	}
	/* 処理を記述 */

}
add_action( 'pre_get_posts','my_pre_get_posts' );

pre_get_postsで表示件数を指定する場合の基本フォーマットはこちら。
この中にある

if( is_admin() || !$query->is_main_query() ){
	return;
}

この記述はとりあえず書いておくものと思ってもらえれば大丈夫です。

その下の/* 処理を記述 */の部分に各ページを分岐して表示件数を指定していきます。

	if( $query->is_front_page() || $query->is_home() ){
		$query->set('posts_per_page',10);
	}

上記記述はトップページのメインクエリの表示件数を10件に変更するという記述です。

その他にも各ページ以下のように分岐することでそれぞれのメインクエリを個別に切り分けることが可能です。

if( $query->is_post_type_archive('news') ){
		// カスタム投稿タイプ「news」の場合
		$query->set('posts_per_page',10);
}
if( $query->is_tax('news_category') ){
		// カスタムタクソノミータイプ「news_category」の場合
		$query->set('posts_per_page',15);
}
if( $query->is_search() ){
		// 検索ページの場合
		$query->set('posts_per_page',20);
}

pre_get_postsを使用したサンプルソース

function my_pre_get_posts( $query ){
	if( is_admin() || !$query->is_main_query() ){
		return;
	}
	if( $query->is_front_page() || $query->is_home() ){
		$query->set('posts_per_page',10);
	}
	elseif( $query->is_post_type_archive('news') ){
		// カスタム投稿タイプ「news」の場合
		$query->set('posts_per_page',10);
	}
	elseif( $query->is_tax('news_category') ){
		// カスタムタクソノミータイプ「news_category」の場合
		$query->set('posts_per_page',15);
	}
	elseif( $query->is_search() ){
		// 検索ページの場合
		$query->set('posts_per_page',20);
	}
}
add_action( 'pre_get_posts','my_pre_get_posts' );

以上、pre_get_postsの使い方でした。