为什么要多次调用Pre_Get_Posts挂钩?

时间:2018-11-09 作者:Riccardo

我正在使用pre_get_posts 然而,由于hook没有按预期工作,我发现函数被调用了4次,当第一个调用按预期运行时,后续调用将无法正确运行。我想知道为什么我的自定义挂钩被运行了不止一次!

我找到了一个article that explains why this may happen, 但我很困惑,因为就我而言,这根本不应该发生。。。。

代码:

function exclude_category( $query ) {
    global $acorn_user;
    $tax_query = array();

    if ( $query->is_feed ) {
        /**** Exclude "exclude" category posts from feed ********/
        $query->set(\'cat\', \'-617, -618\');
        return $query;
    }

    $args = array(
        \'category__not_in\' => 2 ,
        \'category__in\' =>  22,
        \'posts_per_page\' => 7,
        \'post_status\' => \'publish\');

    if (!is_user_logged_in()  /*&& !is_admin()*/) {
        /**** Exclude child categories ********/
        if ($query->is_category(3) || $query->is_category(68) || $query->is_category(69) || $query->is_category(70)) {
            $queried_object = get_queried_object();
            $child_cats = (array)get_term_children($queried_object->term_id, \'category\');

            if (!$query->is_admin) {
                //exclude the posts in child categories
                $tax_query[] = array(\'category__not_in\', array(68, 69, 70, 81, 82, 83));
            }
        }
    }
    //exclude search results for parents & teachers & non logged users
    if ( $query->is_search && $query->is_main_query() ) {
        if(empty($acorn_user) || !in_array( \'teacher\', (array) $acorn_user->roles )) {
            $tax_query[] = array(\'post__not_in\', array(30140, 30020, 30008, 29998, 29991, 21458,20197,11986,6614));
        }
    }
    if (!empty($tax_query)) {
        $query->set(\'tax_query\', $tax_query);
    }
    return $query;
}
add_filter( \'pre_get_posts\', \'exclude_category\' ); 

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

这个pre_get_posts 操作可在查询帖子时运行。这显然包括显示最新帖子或当前页面的主查询,但也包括查询任何其他帖子的时间。因此,这将包括使用WP_Query()get_posts() 在插件或模板中,任何最近的帖子或类似的小部件,以及菜单(菜单项实际上是帖子类型,因此站点上的任何菜单都会涉及帖子查询)。

如果您只想影响主查询(即您循环使用的查询have_posts(), 你需要检查一下$query->is_main_query():

function wpse_318765_pre_get_posts_callback( $query ) {
    if ( $query->is_main_query() ) {

    }
}

结束

相关推荐

About Hooks and Filters

嗯,我很难理解动作和过滤器之间的区别。我确实在代码中使用动作,但我是一个新手,甚至连一点过滤器都不知道。我去过codex,以及NickTheGeek、BillErickson、GaryJones等的多个网站,但没有去过vein。如果你能用简单的话告诉我,并举例说明动作、过滤器和挂钩的基本内容和区别。非常感谢。