WordPress pre_get_posts() の書き方まとめ

Takashi Fujisakiのアバター
1450文字

WordPressでメインループの出力をカスタマイズする場合に使うのが pre_get_posts()。書き方をまとめました。

<?php
//メインループを変更する場合。query_postは非推奨。pre_get_postsを使う。functions.phpに記述。

function change_posts_per_page( $query ) {
  // おまじない
	if ( is_admin() || ! $query->is_main_query() )
		return;

  // 以下にカスタマイズを記述
	if ( $query->is_archive() ){
		$query->set( 'posts_per_page', '5' );
	}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );


// 条件分岐の例

//アーカイブページ
if ( $query->is_archive() ) { ... }

// その他下記の条件分岐が使えます(WordPress3.5.1時点 抜粋)。

// 投稿タイプアーカイブ(引数は投稿タイプ名, または配列)(ラベルではない)
$query->is_post_type_archive( $post_types ) { ... }

// 著者アーカイブ(引数は著者ID, ニックネーム, 表示名, またはそれらの配列)
$query->is_author( $author ) { ... }

// カテゴリーアーカイブ(引数はカテゴリーID, スラッグ, 名前,またはそれらの配列)
$query->is_category( $category ) { ... }

// タグアーカイブ(引数はタグスラッグ, またはその配列)
$query->is_tag( $slug ) { ... }

// タクソノミーアーカイブ(引数はタクソノミーのスラッグと、タームのID,名前,スラッグ,またはそれらの配列)
$query->is_tax( $taxonomy, $term ) { ... }

//日付アーカイブ
$query->is_date() { ... }

// フィード(引数はフィードの種類)
$query->is_feed( $feeds ) { ... }

// フロントページ
$query->is_front_page() { ... }

// 固定ページ(引数はページID, タイトル,スラッグ, またはそれらの配列)
$query->is_page( $page ) { ... }

// 検索結果
$query->is_search() { ... }

// 投稿(引数は投稿ID, タイトル, スラッグ, またはそれらの配列)
$query->is_single( $post ) { ... }

// どの投稿タイプのシングルか(引数は投稿タイプ,またはその配列)
$query->is_singular( $post_types ) { ... }

// 404
$query->is_404()