我正在使用一个名为Userpro 的插件来为我的用户提供额外的元信息。特别是一个名为 的字段,business_category在数组中存储每个用户的类别列表。数据库中的信息看起来有点像这样a:2:{i:0;s:17:"-Entrepreneurship";i:1;s:11:"-Leadership";}。
我知道可以查询 WP 用户,get_users( $args );但是由于我查询的字段是一个数组,所以我不太确定从这里去哪里。
非常感谢任何帮助。谢谢!
如果您可以控制数据的存储方式,那么显而易见的建议是将信息拆分为单独的元键。然而,由于情况并非如此,我们必须使用更丑陋的方法来解决这个问题。我过去曾这样做过,但我对此并不满意,但有时你不得不这样做。
请注意,随着usermeta表的增长,该查询最终可能会开始给您的系统带来压力。因此,最终您可能必须找到一种方法将此信息拆分为单独的元密钥,或者只是business_category单独存储。
function get_users_by_business_category( $category ) {
return get_users( array(
'meta_query' => array(
array(
'key' => 'business_category',
'value' => gen_sql_like( false, $category ),
'compare' => 'LIKE',
)
),
) );
}
function gen_sql_like( $key = false, $value ) {
if ( $key ) {
return str_replace( array( 'a:1:{', '}' ), array( '', '' ), serialize( array( $key => $value ) ) );
} else {
return str_replace( array( 'a:1:{i:0;', '}' ), array( '', '' ), serialize( array( $value ) ) );
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个用法示例:
$users = get_users_by_business_category( '-Entrepreneurship' );
Run Code Online (Sandbox Code Playgroud)
因此,这里发生的事情是,我们序列化一个包含搜索值的数组 - 在本例中为“-Entrepreneurship”,然后我们删除该数组的序列化定义的开头和结尾。所以'value'我们的部分meta_query是这样的:
s:17:"-Entrepreneurship";
设置compare为LIKE将使 WordPress%在我们的搜索值之前和之后添加,因此它在最终查询中实际上看起来像这样:'%s:17:"-Entrepreneurship";%'因此它将匹配其中包含“-Entrepreneurship”的任何记录。