メインクエリの編集

pre_get_postsアクション(推奨)

このフックはクエリ変数オブジェクトの生成後、実際にクエリが実行される前に呼び出される。

https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7/pre_get_posts

検索結果のメインクエリだけ表示件数を12件にする例:

/* 検索結果を12件表示 */
add_action( 'pre_get_posts', function ( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        $query->set( 'post_type', array( 'example' ) );
        $query->set( 'posts_per_page', 12 );
    }
});

query_posts(非推奨)

注: query_posts()はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化されており、問題が発生しやすい方法である。非効率的で(SQLクエリを再実行する)、一部の状況では適切に動作しない(特にページング処理)。モダンなWordPressコードではもっと安定したメソッドを使うべきである。例えばpre_get_postsフックを使った方法などである。ひとことで言うと、query_posts()は決して使うべきではない。

https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/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_posts()の引数に元のクエリ配列をマージする方法がある。

global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'product' ) );
query_posts( $args );

※ $query_stringグローバル変数を使う方法は古いWordPressの記法であり、現在のバージョンでは非推奨・非対応のため、上記の$wp_query->queryをマージする方法を使う。