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
term_taxonomy
代码的其他部分工作正常,我可以修改s
and post__not_in
vars 没有任何问题,但如果我尝试使用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);
但我仍然无法让它工作。关于我可能做错了什么的任何想法?