使用tax_query在$ wp_query->请求中创建0 = 1

时间:2012-06-22 01:07:27

标签: wordpress

这是我第一次尝试使用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-code产品。 1 {}在term_taxonomy

代码的其他部分工作正常,我可以毫无问题地修改spost__not_in变量,但如果我尝试使用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表。没有termsterm_relationshipsterm_taxonomy表。

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

$args = array(
  array(
    'taxonomy' => 'pa_ordering-code',
    'field' => 'name',
    'terms' => array($keyword),
    'operator' => 'LIKE'
  )
);
$query->set('tax_query', $args);

但我仍然无法让它发挥作用。关于我可能做错的任何想法?

2 个答案:

答案 0 :(得分:3)

include_children 参数设置为 false 解决了我的问题:

$args = array(
  array(
    'taxonomy' => 'taxonomy-name',
    'field' => 'id',
    'terms' => array(1, 2, 3, 4),
    'include_children' => false,
    'operator' => 'AND'
  )
);

当tax_query中存在嵌套术语时,似乎会出现错误(例如,2是1的子级)。

答案 1 :(得分:0)

当您搜索的此类分类或分类法参数不存在时,通常会发生这种情况。例如,如果您通过slug搜索,分类名称有拼写错误或slug名称。 在这种情况下,很难说你重写了分类法查询。