微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

meta_query 搜索名称,当它们有中间名首字母时 - PHP、WordPress

如何解决meta_query 搜索名称,当它们有中间名首字母时 - PHP、WordPress

我必须建立一个搜索表单,在其中按全名(名字 + 中间名首字母 + 姓氏)搜索公司成员。所有的名字都采用这种形式:John B. Doe

以下代码适用于这些情况:John,John B.,Doe,B.,John B. Doe,但不适用查询搜索{{1} }.

John Doe

我应该如何改进查询以同时使用:姓名和姓氏(John Doe)以及姓名、姓氏加上中间名首字母(John B. Doe)?

解决方法

首先,如果只有 WordPress 不转义 %(即搜索关键字)中的 value 字符,您可以简单地将搜索关键字中的空格替换为 {{1} },因此你会得到一个像 % 这样的子句,它会匹配 meta_value LIKE '%John%Doe%'

因此,因为搜索关键字中的 John B. Doe 被转义(这是一件好事,顺便说一句),那么您可以改为使用 %(正则表达式搜索),然后将空格替换为REGEXP 相当于 .* 子句中的 %

工作示例

在您的代码中替换它:

LIKE

这样:

$args['meta_query']['name_search']['compare'] = "LIKE";
$args['meta_query']['name_search']['value'] = $_POST['search'];

在 WordPress 5.7.2 中尝试并测试过,但请注意 MySQL reference manual 中的“非多字节安全”警告。

替代解决方案(相当于上面的一个)

如果您想使用 // 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; 而不是 LIKE,但不想最终对同一键进行大量元查询,那么您可以:

使用三个搜索字段,即名字、姓氏和中间名首字母,以及三个元子句,每个搜索字段一个,但都将 REGEXP 设置为 key。例如

_full_name
,

我可以建议以下解决方案:

$search = $_POST['search'];
$words  = explode( $search,' ' );
$words  = array_filter(
    $words,function ( $word ) {
        return ! empty( trim( $word ) );
    }
);

foreach ( $words as $index => $word ) {
    $query_name          = "name_search_$index";
    $args['meta_query'][ $query_name ] = [
        'key'     => '_full_name','value'   => $word,'compare' => 'LIKE',];
}

代码说明:

  1. 我将搜索词组拆分为单词。单词是任何符号序列 空格之间
  2. 我删除了空格。如果您的搜索字符串是
    John Doe
    John  Doe
       John        Doe   
    ,搜索结果应该相同。
  3. 我构建了多个查询。每个查询对应一个单词。如果您搜索 John Doe,则查询由 2 个查询构建。查询与字数一样重要。

此解决方案的问题:

  1. 太多的字词就是太多的查询。太多包含 LIKE 的查询太慢了。
  2. 搜索
    John Doe
    Doe John
    会得到相同的结果。单词的顺序对结果没有影响。

我建议仅将此解决方案用作临时解决方案。 好的解决方案 - 正在使用全文搜索插件或编写全文搜索解决方案 你自己。您可以在 MySQL 官方页面上找到有关全文搜索的更多详细信息: https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。