3

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

代码的其他部分工作正常,我可以修改sand post__not_invars 没有任何问题,但如果我尝试使用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);

但我仍然无法让它工作。关于我可能做错了什么的任何想法?

4

2 回答 2

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 的子项),似乎会发生错误。

于 2012-10-29T06:28:28.013 回答
0

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

于 2018-04-18T08:47:39.310 回答