问题描述

我需要创建一个搜索页面,显示与提供的搜索相关的任何内容。即含有它的 commentseventspostsCPT 和具有该名称的 users

How can I search for users in the site who’s first or last name contains the search phrase ?

最佳解决方案

搜索主表

只需使用 WP_User_Query 和搜索参数。

因此,如果要在 user_email{$wpdb->prefix}users 表中的类似列中搜索具有关键字的用户,则可以执行以下操作:

$users = new WP_User_Query( array(
    'search'         => '*'.esc_attr( $your_search_string ).'*',
    'search_columns' => array(
        'user_login',
        'user_nicename',
        'user_email',
        'user_url',
    ),
) );
$users_found = $users->get_results();

请记住,*是通配符。因此,将 user_email 限制为单个域将为您提供以下搜索字符串:*@example.com

search 字符串具有一些”magic” 功能:search_columns 默认为…

  • user_email 如果 @存在于 search 参数中。

  • user_loginID 如果 search arg 是数字

  • user_url 如果 search 字符串包含 http://https://

  • 或者 user_loginuser_nicename,如果存在字符串。

只有在没有指定 search_columns 参数的情况下,才会设置所有这些默认值。

搜索元表

如果要搜索例如 first_namelast_name,那么您将不得不做一个 meta_query,因为它们不是主表的一部分:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        )
    )
) );
$users_found = $users->get_results();

确保您检索正确的搜索字符串。通常这将是 get_query_var('s');,但它可能 – 取决于您的形式 name/id 以及您可能想要使用 $_GET['user_search']检索的不同之处。确保正确地打开它,并从字符串的开头和结尾删除不需要的空格。

请记住,这是一个 array( array() ),因为有 relation 密钥。如果您只想搜索单个密钥,则可能会更容易,只需执行以下操作:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'meta_key'     => 'first_name',
    'meta_value'   => $search_string,
    'meta_compare' => 'LIKE',
) );
$users_found = $users->get_results();

最终查询

结果可能看起来接近以下:

$search_string = esc_attr( trim( get_query_var('s') ) );
$users = new WP_User_Query( array(
    'search'         => "*{$search_string}*",
    'search_columns' => array(
        'user_login',
        'user_nicename',
        'user_email',
        'user_url',
    ),
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'first_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        ),
        array(
            'key'     => 'last_name',
            'value'   => $search_string,
            'compare' => 'LIKE'
        )
    )
) );
$users_found = $users->get_results();

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。