今回はWordPressの検索結果ページのみ表示件数を変える方法を解説します。
query_posts()は非推奨
色んな人が何度も何度も言っているのに一向に消える気配がないのが謎ですが、query_posts()
を使った処理は非推奨なので使わないようにしてください。
今回解説する検索結果ページの表示件数を変える方法を調べると、揃いも揃ってquery_posts()
を乱用している記事ばっかりです。
パフォーマンスが悪かったり(サイトが重くなる)、一部の処理(特にページング)で動作がおかしくなる可能性があったりと使うメリットが全く無い処理です。
WP_Query()
やget_posts()
といった別の優れた方法があるのでそれを使うようにしてください。
Codexでもボロクソ言われるくらい推奨されない処理です。あまり詳しく知らない人はリンクを貼っておくので上の方をざーっと読んでください。マジで。
>>テンプレートタグ/query posts – WordPress Codex 日本語版
ではquery_posts()
なしで検索結果ページのみ表示件数を変える方法ですが、WP_Query()
とpre_get_posts()
の2種類のやり方があるので両方解説します。get_posts()
は検索キーワードを取得できないので残念ながら使えません。
1.WP_Query()を使って検索結果ページのみ表示件数を変える方法
以下のように書けばokです。
<?php
$args = array(
'posts_per_page' => 20, // ←表示件数を変更
's' => get_search_query(), // ←検索キーワードで絞り込み
);
$search_query = new WP_Query( $args );
if ( $search_query->have_posts() ):
while ( $search_query->have_posts() ): $search_query->the_post();
?>
<!-- ここにhtml -->
<?php
endwhile;
endif;
wp_reset_postdata();
?>
検索結果ページではメインループを使うのが定番ですが、メインループだと検索結果ページのみ表示件数を変えることができないのでサブループを使用します。
ポイントは's' => get_search_query()
ですね。
's'
は検索キーワードで記事を絞り込むキーです。get_search_query()
で検索キーワードを取得できるので、キーワードに一致する記事のみを表示させることができます。
他は普通のサブループと同じですね。最後にwp_reset_postdata()
を忘れないようにしましょう。
サブループを詳しく知らない人は過去記事で解説しているので参考にしてみてください。
>>WordPressでサブループを作る方法!メインループとの違いは?
2.pre_get_posts()で検索結果ページのみ表示件数を変える方法
pre_get_posts()
を使って表示件数を変える場合はfunctions.phpに書きます。アクションフックと呼ばれるやつです。
以下のようなコードでokです。
function my_pre_get_posts( $query ) {
if ( is_admin() || !$query->is_main_query() ) {
return;
}
if ( $query->is_search() ) {
$query->set( 'posts_per_page', 20 ); // ←表示件数を変更
}
}
add_action('pre_get_posts','my_pre_get_posts');
まずif( is_admin() || !$query->is_main_query() )
で管理画面とメインクエリ以外では何もせずにreturn
することで処理から除外しておきます。これはお決まりの書き方ですね。
次がポイントです。$query->is_search()
で検索結果ページかどうかを判定し、trueなら$query->set( 'posts_per_page', 20 );
で表示件数を変更しています。
ちなみに$query->set()
ではWP_Query()
と同じ条件が指定できるのでサブループの代わりとして使うこともできます。
複数の条件を指定したいならこんな感じで書けばokです。
$query->set( 'posts_per_page', 20 );
$query->set( 'post_type', 'news' );
$query->set( 'order', 'ASC' );
検索結果ページでヒットした記事を全部表示する
検索キーワードにヒットした記事を全部表示したい場合は'posts_per_page'
に-1
を指定すればokです。
// WP_Query()の場合
'posts_per_page' => -1,
// pre_get_posts()の場合
$query->set( 'posts_per_page', -1 );
まとめ
検索結果ページで表示件数を変更する方法を解説記事はほとんどがquery_posts()
を使っていたのでこれはよくないということで記事を書きました。
何度も言いますがquery_posts()
は使うメリットが一切ない関数なので他の関数を使うようにしてください。