このフックはクエリ変数オブジェクトの生成後、実際にクエリが実行される前に呼び出されます。
検索結果のメインクエリだけ表示を20件にする例
/* 検索結果を20表示 */
add_action( 'pre_get_posts', function($query) {
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', ['example'] );
$query->set( 'posts_per_page', 12 );
}
});
注 2: query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。非効率的で(SQL クエリを再実行します)、一部の状況では適切に実行することもできません(特にページング処理)。モダンな WordPress コードではもっと安定したメソッドを使うべきです。例えばpre_get_posts フックを使った方法などです。ひとことで言うと、query_posts() は決して使うべきではありません。
上記サイトのサンプル
<?php
// クエリ(メインクエリを改変)
query_posts( $args );
// ループ(改変したメインクエリ)
if ( have_posts() ) :
while ( have_posts() ) : the_post();
echo '<li>';
the_title();
echo '</li>';
endwhile;
else:
// 何も取得されなかった
endif;
// クエリをリセット
wp_reset_query();
?>
オリジナルクエリの保持(ページングなど) デフォルトでは query_posts を実行すると、引数で指定した変数を除きページング,カテゴリー,日付などの現在のページのクエリ変数はすべて上書きされます。この時、オリジナルのクエリを保持したい場合は、query_poats() の引数にグローバル変数である $query_stringを用いることができます。
例えば、残りの投稿文字列に影響をおよぼすこと無く投稿の表示順を保持する時、ループの前に下記を記述することができます。
global $query_string; query_posts( $query_string . '&order=ASC' ); query_posts() をこのように用いる時、''で囲まれたパラメーターはアンド記号 & で始まる必要があります。
あるいは、元のクエリ配列を引数配列に統合することもできます。
global $wp_query; $args = array_merge( $wp_query->query, array( 'post_type' => 'product' ) ); query_posts( $args );