问题描述

Possible Duplicate:
How to know which one is the main query?

我很好奇知道什么叫”main query”?

我在首页有两个查询。

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 正在通过它。

你可以解释一下,”main query” 是什么?

PS:我已经找到 almost a similar question 与解决方案来改变 pre_get_post 钩子中的查询,通过自定义查询 vars 。

最佳解决方案

您的过滤器有一个错误,即当您调用 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;
    }
}

次佳解决方案

主要查询是当 WordPress 确定要显示请求 URI 时自动触发的查询。

WP_Query 的后续实例从不是主要查询,但您可以使用它们来替换 $GLOBALS['wp_the_query']中的主查询结果。不要这样做

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。