这是我第一次尝试使用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
和post__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);
但我还是无法让它发挥作用。你知道我做错了什么吗?