不幸地tax_query
没有compare
匹配修饰符类meta_query
, 允许使用“LIKE”运算符进行通配符搜索。所以你需要有一个不同的方法。我可以想出两种方法来解决这个问题,
1) 使用全局$wpdb 对象来搜索与文本搜索匹配的所有术语,然后使用这些术语ID添加operator 将修饰符匹配到当前查询,[编辑:添加了调试行,请确保enable WP_DEBUG]
global $wpdb;
$term_ids = $wpdb->get_results(
"
SELECT {$wpdb->terms}.term_id
FROM {$wpdb->terms}, {$wpdb->term_taxonomy}
WHERE {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id
AND {$wpdb->term_taxonomy}.taxonomy LIKE \'pa_reference-p-no\'
AND {$wpdb->terms}.slug LIKE \'%{$input_search_txt}%\'
",
ARRAY_N
);
//you can debug your term id results at this point by printing them in your log file, make sure WP_DEBUG is set to true in your wp_config.php file.
error_log(\'TERM IDS:\'.print_r($term_ids,true)); //should be an array of term ids.
$args = array(
\'post_type\' => \'product\',
\'product_cat\' => \'construction\',
\'posts_per_page\' => 12,
\'paged\' => $paged,
\'tax_query\' => array(
array(
\'taxonomy\' => \'pa_reference-p-no\',
\'terms\' => $term_ids,
\'operator\' => \'IN\'
)
);
);
$loop = new WP_Query( $args );
2)第二种方法是使用
query filter posts_where 滤器因此,您可以简化查询,只搜索“产品”帖子,然后使用修改分类条件,
add_filter( \'posts_where\' , \'posts_where\', 10,2 );
function posts_where( $where , $query) {
if( \'product\' == $query->query_vars[\'post_type\'] && !$query->is_main_query() && !$query->is_admin() ) {
global $wpdb;
if ( isset( $_POST[\'input_search_txt\'] ) && !empty( $_POST[\'input_search_txt\'] ) ) {
$where .=
"
AND {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id
AND {$wpdb->term_taxonomy}.taxonomy LIKE \'pa_reference-p-no\'
AND {$wpdb->terms}.slug LIKE \'%{$_POST[\'input_search_txt\'];}%\'
";
}
}
return $where;
}
这两种解决方案都应该有效,尽管我还没有对它们进行测试。第一个更容易调试,并且只针对当前查询。第二种解决方案效率更高,因为它可以减少对DB的1次命中,但是请记住,如果不过滤
$query
在初始条件下,最终可能会影响其他自定义查询,并且这些查询可能很难调试。
如果您在理解上有任何问题,请在下面的评论中告诉我。