有没有办法在$query->set('tax_query', ...)过滤器中使用pre_get_posts?例如,下一个代码不会更改查询。请注意,我正在通过自定义搜索构建$分类标准。

function custom_search_filter($query) {
        ...

        // array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
        $taxonomies = implode(',', $taxonomy_arr);

        // https://wordpress.stackexchange.com/questions/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies

        $taxonomy_query = array('relation' => 'AND', $taxonomies);

        $query->set('tax_query', $taxonomy_query);
    }

    return $query; 
}


add_filter( 'pre_get_posts', 'custom_search_filter', 999 );


提前感谢。

评论

为什么将WP_Query对象传递给参数设置方法?

是的,我错了,现在我使用eval将该字符串转换为数组(我真的确定该字符串是安全的)。谢谢。

#1 楼

过滤器中的$query变量表示一个WP_Query对象,因此您不应将新的WP_Query对象传递给用于设置该对象属性的方法。

您复制代码的问题是使用过滤器不正确,我觉得这是您问题的症结所在。

是的,tax_query可以在pre_get_posts(或类似的parse_request)过滤器/操作中使用。

这里是一个示例:
为搜索查询指定自定义分类法

function search_filter_get_posts($query) {
    if ( !$query->is_search )
        return $query;

    $taxquery = array(
        array(
            'taxonomy' => 'career_event_type',
            'field' => 'id',
            'terms' => array( 52 ),
            'operator'=> 'NOT IN'
        )
    );

    $query->set( 'tax_query', $taxquery );

}
add_action( 'pre_get_posts', 'search_filter_get_posts' );


评论


您能否举一个在pre_get_posts动作中设置tax_query的工作示例?

–helgatheviking
2012年2月22日在20:05

$ tax_query是一个包含嵌套数组的对象。您不能使用嵌套数组覆盖对象。

– AlxVallejo
13年4月17日在19:11

$ tax_query不是对象,但是$ query是(它是WP_Query的实例)。

– t31os
13年4月17日在21:29



这不会完全覆盖tax_query吗?不应将$ taxquery附加到tax_query arg中的当前数据?

– hot_barbara
18年5月25日在19:33

@hot_barbara,它将覆盖tax_query。此版本将附加当前查询:$ taxquery = array('relation'=>'OR',array('taxonomy'=>'career_event_type','field'=>'id','terms'=> array( 52),'operator'=>'NOT IN'));

– Rambillo
20年1月20日在22:20

#2 楼

税务查询还要求您在查询中设置tax_query对象,因为查询已被解析。请参阅我对“修改分类法”页面的回答,以排除子分类法中的项目。