使用TAX_QUERY在$wp_Query->请求中创建1=0或1=1

时间:2012-06-21 作者:Rolando Cruz

这是我第一次尝试使用pre_get_posts 操作/过滤器

这是当前连接到它的函数:

function advanced_product_search_filter($query)
{
  if(!is_admin() &&
     is_main_query() && 
     is_search() && $query->query_vars[\'post_type\'] == \'product\')
  {
    $keyword = $_GET[\'s\'];

    if($_GET[\'exactly\'])
      $keyword = $_GET[\'s\'] . \' "\'. $_GET[\'exactly\'] . \'"\';

    if($_GET[\'without\'])
    {
      $excluded = exclude_product_keyword_search($_GET[\'without\'], 
                    $_GET[\'pname\'],
                    $_GET[\'pcode\']
                  );
      $query->set(\'post__not_in\', $excluded);
    }

    if($_GET[\'pname\'])
      $query->set(\'s\', $keyword);
    else
      $query->set(\'s\', \'\');

    if($_GET[\'pcode\'])
    {
      $tax_queries = $query->get(\'tax_query\');
      $tax_queries[] = array(
        array(
          \'taxonomy\' => \'pa_ordering-code\',
          \'field\' => \'name\',
          \'terms\' => array($keyword),
          \'operator\' => \'LIKE\'
        )
      );
      $query->set(\'tax_query\', $tax_queries);
    }
  }
}
这是一个构建在WooCommerce 安装因此,基本上,此函数尝试支持搜索WooCommerce 通过标准搜索(标题和内容)或对名为Ordering Code 这是pa_ordering-codeterm_taxonomy 桌子

代码的其他部分工作正常,我可以修改spost__not_in VAR没有任何问题,但如果我尝试使用tax_query 它,这个问题似乎被打破了。

为了给你一个主意,当我尝试这个:

?s=foo&post_type=product&pname=1&pcode=1&without=non&exactly=foo+bar
正在转储WHERE 条款,我看到了:

AND wp_posts.ID NOT IN (219) 
AND 0 = 1 
AND 
(
  (
    (wp_posts.post_title LIKE \'%foo%\') OR 
    (wp_posts.post_content LIKE \'%foo%\')
  ) AND (
    (wp_posts.post_title LIKE \'%foo bar%\') OR 
    (wp_posts.post_content LIKE \'%foo bar%\')
  )
) 
AND wp_posts.post_type = \'product\' 
AND (wp_posts.post_status = \'publish\' OR wp_posts.post_status = \'private\') 
AND
( 
  (
    wp_postmeta.meta_key = \'_visibility\' AND
    CAST(wp_postmeta.meta_value AS CHAR) IN (\'visible\',\'search\')
  ) 
)
请注意AND 0 = 1? 当我把JOIN 子句,我确信tax_query 参数的解释不正确,因为我只看到postmeta 桌子在那里。不terms, term_relationships, 或term_taxonomy 桌子

我还试图简单地覆盖现有的tax_query (如果有)这样做:

$args = array(
  array(
    \'taxonomy\' => \'pa_ordering-code\',
    \'field\' => \'name\',
    \'terms\' => array($keyword),
    \'operator\' => \'LIKE\'
  )
);
$query->set(\'tax_query\', $args);
但我还是无法让它发挥作用。你知道我做错了什么吗?

2 个回复
SO网友:Otto

这个0 = 1 当条款不存在时发生。

您正在为某些术语集创建查询。在将SQL添加到该主查询之前,它首先执行二次查询以获取相关术语的term\\u id。如果未找到任何项,则返回0=1,以快捷方式执行主查询,因为没有与请求匹配的术语。

SO网友:Łukasz Muchlado

检查“pa\\U ordering-code”分类法的定义。

看起来“query\\u var”属性中的值可能错误。

此代码可能导致类似的后果:

    register_taxonomy(...
        \'query_var\' => true,
    ));
如果是这样,请删除(或更改)查询变量部分并再次检查。

结束

相关推荐

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

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