这是我第一次尝试使用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
表
代码的其他部分工作正常,我可以毫无问题地修改s
和post__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
表。没有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);
但我仍然无法让它发挥作用。关于我可能做错的任何想法?
答案 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名称。 在这种情况下,很难说你重写了分类法查询。