问题描述
我需要创建一个搜索页面,显示与提供的搜索相关的任何内容。即含有它的 comments
,events
,posts
,CPT
和具有该名称的 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_login
和ID
如果search
arg 是数字 -
user_url
如果search
字符串包含http://
或https://
-
或者
user_login
和user_nicename
,如果存在字符串。
只有在没有指定 search_columns
参数的情况下,才会设置所有这些默认值。
搜索元表
如果要搜索例如 first_name
或 last_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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。