有没有一种方法可以在pre_get_posts过滤器中使用$ query-> set('tax_query'?


16

有没有办法$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);

        // /wordpress/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 );

提前致谢。


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

是的,我错了,现在我使用eval将该字符串转换为数组(我真的确定该字符串是安全的)。谢谢。
何塞·巴勃罗·奥罗斯科马林

Answers:


35

$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' );

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

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

3
$tax_query不是一个对象,$query但是(是的一个实例WP_Query)。
t31os 2013年

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.