WordPressテックラボ

メインループとサブループ

メインループの概要

WordPressでメインページやカテゴリ一覧などで一覧のループ処理を行う際、メインループという概念があることを理解する必要があります。
トップページに最新記事を表示するループや、検索結果のページに結果を表示するループなどがメインループと呼ばれ、1ページに1回だけ処理されます。
メインループは明示的にデータ取得部分を記述しなくても自動的にデータが取得されるので、たとえばメインページであれば、データ取得を飛ばしていきなり次のように出力処理に進むことができます。

<?php
while ( have_posts() ) : the_post();
	get_template_part( 'content', get_post_format() );
endwhile;
?>

query_posts

取得したいデータの内容を変えたいときに、初めてデータ取得部分を追加してあげます。
たとえば今では非推奨ですが、query_postsに取得したいカテゴリ名などを指定してフィルタリングすることができます。

<?php
query_posts( 'category_name=art' )
while ( have_posts() ) : the_post();
	get_template_part( 'content', get_post_format() );
endwhile;
?>

pre_get_posts

現在の公式に推奨されているのはpre_get_postsというアクションフックです。
アクションフックは指定したアクションをトリガーとして処理を行う機構で、主にfunctions.phpに記述します。

次のようにis_admin()やis_home()などを使ってどのタイミング、ページで実行したいのかを指定し、set()でフィルタリングの設定を行います。
下記ではカテゴリIDが"123"の記事だけ表示するように指定しています。

function query_at_home( $query ) {
	// ダッシュボードまたは管理パネルが表示されている、もしくはメインクエリではない場合は処理を中断
	if ( is_admin() || ! $query->is_main_query() ) return;
	if ( $query->is_home() ) {
		$query->set( 'cat', '123' );
		return;
	}
}
add_action( 'pre_get_posts', 'query_at_home' );

WordPress日本語版Codexのpre_get_posts

サブループの概要

サブループは任意にユーザがいくつでも追加できるループです。
メインループのようにデータ取得部分を省略できないので、明示的にどのデータを取得するかを指定する必要があります。

WP_Query

サブループにはWP_Queryを使います。
典型的なWP_Queryの使い方は下記のようになります。

$wp_query = new WP_Query(array(
	'cat'	=> '-123',	// カテゴリIDの123を除外
));
while ( $wp_query->have_posts() ) {
	$wp_query->the_post();
	....
}
wp_reset_postdata(); //クエリをリセット

WP_Queryには数多くのパラメータが用意されていますが、そのコード・スニペットの翻訳版が下記になります。

WP_Queryの使い方をPHPコードにまとめた便利なコード・スニペット

関連記事