メニュー

WordPressのメインループで読み込む記事を設定する

2021.02.01

WordPressのカスタマイズで、状況によってメインループとサブループを使い分けていると思いますが、サブループのときの一覧表示の設定は分かりやすいですが、メインループを扱う際に表示件数や並び順、その他細かい設定を行う際にどうすればよいのか?有効な方法を解説します。

※メインループとサブループの違いは↓記事で説明してます。

ちなみに、WP_Queryなどの場合は下記のように記述するのが一般的だと思います。
表示するための設定を配列に記述して変数の$argsに入れ、WP_Queryにセットして表示させます。

//サブループのサンプル
$args = array(
	'post_type' => 'hoge',
	'posts_per_page' => -1, //表示件数
	'meta_key' => 'pickup',
	'meta_value' => 'pickup_on',
	'meta_compare' => 'LIKE',
	'orderby' => 'date',
	'order' => 'DESC'
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) {
	while ( $the_query->have_posts() ) {
		$the_query->the_post();
		//ここでループさせる記述
	}
}
wp_reset_query();//WP_Queryをリセット

ではメインループの一般的な記述を見てみましょう。
メインループの記述はシンプルで件数や並び順などをその場で配列にセットすることが出来ません。

if( have_posts() ) {
	while( have_posts() ) {
		the_post();
		//ここでループさせる記述
	}
}

メインループの場合は件数に関しては管理画面の「設定>表示設定」にて投稿の件数を設定することが可能です。

しかし、運用の仕方によっては全部のページで件数が統一されるとも限りませんし、その他絞り込みなど細かい設定に関しては管理画面で行うことが出来ません。
メインループで、各テンプレートごとに細かい設定を加える場合は、functions.phpでアクションフックpre_get_postsを使うことによって可能になります。

/*-----------------------------------
 メインループのクエリセット
-----------------------------------*/
function pickup_sort( $query ) {
	//管理画面は除外
	if ( is_admin() || ! $query->is_main_query() ) {
		return;
	}
	if ( $query->is_front_page() ) {
		//トップページの表示件数
		$query->set( 'posts_per_page', -1 );

	} elseif ( $query->is_post_type_archive('hoge') ) {
		//投稿タイプhoge
		$query->set( 'posts_per_page', -1 );
		$query->set( 'meta_key', 'pickup' );
		$query->set( 'meta_value', 'pickup_on' );
		$query->set( 'meta_compare', 'LIKE' );

	} elseif( $query->is_tax('hoge-cat') ) {
		//投稿タイプhogeのタクソノミー
		$query->set( 'posts_per_page', -1 );
	}
}
add_action( 'pre_get_posts', 'pickup_sort' );

気を付ける点は、管理画面での除外を行うこと。これを怠ると管理画面の一覧表示に影響が出てしまいます。

特に指定しなければデフォルトの設定で一覧表示されますが、上記のようにテンプレートごとに$query->set()に設定を入れることによってWP_Queryと同じように細かい設定を行うことができます。

メインループが使えるテンプレートでわざわざサブループを使うと余分なクエリを扱う事になりますので、メインとサブをしっかり使い分けたうえで、必要な場合は上記のようにメインループの設定を行えばスマートな実装になるかと思います。

関連記事