运算符“NOT IN”在TAX_QUERY中不起作用

时间:2017-02-13 作者:NiloVelez

我正在尝试改变WooCommerce商店的搜索功能,以便当用户进行匹配product_tag slug返回未指定产品标签的产品。

这背后的逻辑是向搜索“面筋”的用户显示所有不含面筋的产品。

除了操作符参数外,我的代码几乎正常工作。

我正在抛出此查询:

http://example.com/?s=gluten

This function returns all the products tagged as the search query:

function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
    $term = get_term_by(\'slug\', get_query_var(\'s\'), \'product_tag\');
    if ( $term && !is_wp_error( $term ) ) {
        $tax_query = array(
                \'taxonomy\'  => \'product_tag\',
                \'field\'     => \'slug\',
                \'terms\'     => $term->slug,
                \'operator\'  => \'IN\'
        );
        $query->tax_query->queries[] = $tax_query;
        $query->query_vars[\'tax_query\'] = $query->tax_query->queries;
     }
}}
add_action( \'pre_get_posts\', \'menta_pre_get_posts\', 1 );

But if I change the operator to NOT IN, I get no results:

function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
    $term = get_term_by(\'slug\', get_query_var(\'s\'), \'product_tag\');
    if ( $term && !is_wp_error( $term ) ) {
        $tax_query = array(
                \'taxonomy\'  => \'product_tag\',
                \'field\'     => \'slug\',
                \'terms\'     => $term->slug,
                \'operator\'  => \'NOT IN\'
        );
        $query->tax_query->queries[] = $tax_query;
        $query->query_vars[\'tax_query\'] = $query->tax_query->queries;
     }
}}
add_action( \'pre_get_posts\', \'menta_pre_get_posts\', 1 );
产品标签正确,有些产品没有面筋标签

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

我怀疑您需要一个用于术语的数组-尽管我不确定为什么它会与“IN”而不是“not IN”。。。但我想试试这个:

function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
    $term = get_term_by(\'slug\', get_query_var(\'s\'), \'product_tag\');
    if ( $term && !is_wp_error( $term ) ) {
        $tax_query = array(
                \'taxonomy\'  => \'product_tag\',
                \'field\'     => \'slug\',
                \'terms\'     => array($term->slug),
                \'operator\'  => \'NOT IN\'
        );
        $query->tax_query->queries[] = $tax_query;
        $query->query_vars[\'tax_query\'] = $query->tax_query->queries;
        $query->set(\'tax_query\', $query->tax_query->queries);
     }
}}
add_action( \'pre_get_posts\', \'menta_pre_get_posts\', 1 );
希望这有帮助!

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post