问题描述
我需要创建一个搜索页面,显示与提供的搜索相关的任何内容。即含有它的 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如果searcharg 是数字 -
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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。