web-dev-qa-db-ja.com

「メインエリ」とは何ですか?

可能な重複:
どのクエリが主なクエリであるかを知る方法は?

いわゆる「メインクエリ」とは何かを知りたいのですが。

私が持っているのはフロントページ上の2つのクエリです。

if (have_posts()) : while (have_posts()) : the_post();
    // do the main loop
endwhile; endif;

$posts = new WP_Query(array('post_type' => 'some_other_post_type'));
while ($posts->have_posts()) : $posts->the_post();
    // do the secondary loop
    // but still operating with the some_post_type
endwhile; wp_reset_postdata();

そして私が欲しいのは効率のためにメインのクエリを私のカスタム投稿タイプに変更することだけです。

add_action( 'pre_get_posts', 'some_name');
function some_name($query) {
    if (is_front_page() && is_main_query()) {
        $query->set( 'post_type', 'some_post_type' );
        return;
    }
}

私が考えたのは、そのフックの条件は最初のループでのみ真実になるだろうということですが、new WP_Queryはそれを通過しているようです。

「主な質問」とは何ですか、そうでないものは何ですか。

PS:私は ほとんど同じような質問pre_get_postフック内のクエリをカスタムクエリ変数で変更する解決策を見つけました。

8
Nathan

フィルタにはバグがあります。つまり、is_main_queryを呼び出したときに、渡されたクエリがメインクエリであるかどうか、現在アクティブなクエリがメインクエリであるかどうかをチェックしているわけではありません。

だから代わりにこれを試してください:

add_action( 'pre_get_posts', 'some_name');
function some_name($query) {
    if ($query->is_front_page() && $query->is_main_query()) {
        $query->set( 'post_type', 'some_post_type' );
        return;
    }
}
8
Tom J Nowell

メインのクエリは、WordPressがリクエストURIに何を表示するかを決定したときに自動的にトリガーされるものです。

それ以降のWP_Queryのインスタンスはメインクエリにはなりませんが、それらを使用してメインクエリの結果を$GLOBALS['wp_the_query']に置き換えることができます。 しないでください。

3
fuxia