首先,如果只有 WordPress 不转义(即搜索关键字)%
中的字符value
,您可以简单地将搜索关键字中的空格替换为%
,因此您会得到一个类似于meta_value LIKE '%John%Doe%'
match的子句John B. Doe
。
因此,因为%
in 搜索关键字被转义(这是一件好事,顺便说一句),所以您可以改用(正则表达式搜索),然后用与in a子句等效的REGEXP
a 替换空格。.*
%
LIKE
工作示例
在您的代码中替换它:
$args['meta_query']['name_search']['compare'] = "LIKE";
$args['meta_query']['name_search']['value'] = $_POST['search'];
有了这个:
// Build the regular expression pattern.
$list = preg_split( '/ +/', trim( $_POST['search'] ) );
$regex = implode( '.*', array_map( 'preg_quote', $list ) );
// Then set 'compare' to REGEXP and 'value' to the above pattern.
$args['meta_query']['name_search']['compare'] = 'REGEXP';
$args['meta_query']['name_search']['value'] = $regex;
在 WordPress 5.7.2 中进行了尝试和测试,但请注意MySQL 参考手册中的“非多字节安全”警告。
替代解决方案(相当于上述一种)
如果您想使用LIKE
and not REGEXP
,但又不想最终对同一键进行大量元查询,那么您可以:
使用三个搜索字段,即名字、姓氏和中间名首字母,以及三个元子句,每个搜索字段一个,但都key
设置为_full_name
。例如
/*
* Assuming your form contains these:
<input name="first_name">
<input name="last_name">
<input name="middle_initial">
*/
$name_search = array(
'relation' => 'AND',
);
// * okay, this still uses 3 clauses, but it always would be just 3 clauses
foreach ( array( 'first_name', 'last_name', 'middle_initial' ) as $name ) {
if ( ! empty( $_POST[ $name ] ) ) {
$name_search[ $name ] = array(
'key' => '_full_name',
'value' => sanitize_text_field( $_POST[ $name ] ),
'compare' => 'LIKE',
);
}
}
$args['meta_query']['name_search'] = $name_search;