由于筛选器的原因,Get_Posts()中断

时间:2017-09-12 作者:Sebastian Kurzynowski

“我的自定义帖子类型(works)”的“我的列表视图”页面上有一个筛选器

add_action( \'pre_get_posts\', array($this, \'exclude_category\') );

public function exclude_category( $query){    
       if( is_admin() &&  isset( $_GET[\'cta_filter\']) && ! empty( $_GET[\'cta_filter\'] ) )
        {
            $term =  sanitize_text_field( $_GET[\'cta_filter\'] );

            $query->tax_query->queries[] = array(
                \'taxonomy\' => \'cta_tax\',
                \'field\'    => \'slug\',
                \'terms\'    => array( $term ),
                \'operator\' => \'IN\'
            );

            $query->query_vars[\'tax_query\'] = $query->tax_query->queries;
        }
}
在我筛选我使用的帖子的同一页上get_posts() 它只给我过滤posts 但应该返回所有posts. 如何防止筛选posts 当我使用get_posts() 作用

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

使用检查当前查询是否为主查询$query->is_main_query().

add_action( \'pre_get_posts\', array($this, \'exclude_category\') );

public function exclude_category( $query){    
    if( is_admin() && $query->is_main_query() && isset( $_GET[\'cta_filter\']) && ! empty( $_GET[\'cta_filter\'] ) ) {
        $term = sanitize_text_field( $_GET[\'cta_filter\'] );

        $tax_query = $query->get(\'tax_query\') ?: array();

        $tax_query[] = array(
            \'taxonomy\' => \'cta_tax\',
            \'field\'    => \'slug\',
            \'terms\'    => array( $term ),
            \'operator\' => \'IN\'
        );

        $query->set(\'tax_query\',$tax_query):
    }
}
我想?cta_filter= 只会在您的帖子类型的管理页面上设置,因此不需要进一步的条件,但为了更安全,您可能需要添加另一个条件:

&& \'post_type_name\' === $query->get( \'post_type\' )
还要注意我对您的代码所做的另一个更改。我建议使用get()set() 方法。

结束

相关推荐

当返回值为空时,Apply_Filters为什么要返回非空字符串?

因为这个把我的键盘弄坏了。进行了正确的安装,将数据库上载到新的MySQL,并一直在正确使用子主题。但有件事困扰着我,我想不出来。在我的新安装上(ver2.whowhatwhy.com) 我故意将一些小部件留空。我想,当阅读default-widgets.php wp中的文件包括在该小部件上不会显示标题元素。相反,显示标题小部件是因为,出于某种原因,传递的值apply_filters 是一个空格,而不是空白值$instance[\'title\'] 为空。$title = apply_filters( \'