获取所有具有特定 usermeta 值的 WordPress 用户

use*_*858 0 php wordpress

我正在使用一个名为Userpro 的插件来为我的用户提供额外的元信息。特别是一个名为 的字段,business_category在数组中存储每个用户的类别列表。数据库中的信息看起来有点像这样a:2:{i:0;s:17:"-Entrepreneurship";i:1;s:11:"-Leadership";}

我知道可以查询 WP 用户,get_users( $args );但是由于我查询的字段是一个数组,所以我不太确定从这里去哪里。

非常感谢任何帮助。谢谢!

Nik*_*lov 5

如果您可以控制数据的存储方式,那么显而易见的建议是将信息拆分为单独的元键。然而,由于情况并非如此,我们必须使用更丑陋的方法来解决这个问题。我过去曾这样做过,但我对此并不满意,但有时你不得不这样做。

请注意,随着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";

设置compareLIKE将使 WordPress%在我们的搜索值之前和之后添加,因此它在最终查询中实际上看起来像这样:'%s:17:"-Entrepreneurship";%'因此它将匹配其中包含“-Entrepreneurship”的任何记录。