我正在尝试通过自定义元值(一个INT)排序一系列站点用户。

我可以很好地查询用户,然后将他们重新用于foreach。我目前的查询结果已经从用户表中的display_name返回。我希望它按自定义usermeta值进行排序。

关于如何修改此查询以完成此操作的任何想法?

function get_all_top_members() {
    global $wpdb;
   $gather_users = "SELECT * FROM ".$wpdb->prefix."users ORDER BY display_name ASC";
$all_users = $wpdb->get_results($gather_users);
return $all_users;
}
有帮助吗?

解决方案

您不会在 meta_value 列,因为存储的值未将其视为整数值,但是您可以使用类似于使用方式的方法,当我们使用时WordPress meta_value_num 进行排序,基本上涉及将数字添加到数据的正面。

function get_users_ordered_by_meta( $key = '', $d = 'ASC' ) {
    global $wpdb;
    $d = ( strtoupper( $d ) == 'DESC' ) ? 'DESC' : 'ASC';
    if( '' == $key )
        return;
    $r = $wpdb->get_results( $wpdb->prepare( "
        SELECT u.ID, u.display_name, u.user_nicename, um.meta_value 
        FROM {$wpdb->usermeta} um, {$wpdb->users} u
        WHERE um.user_id = u.ID
        AND um.meta_key = %s
        ORDER by (0 + um.meta_value) $d
    ", $key ) );
    return $r;
}

然后,这为您在元值列上提供了适当的排序。

认为您可能喜欢一个函数,因此您可以在需要的任何地方调用它,只需将其传递给用户设置的元密钥,然后选择更改排序订单即可。

$yourvar = get_users_ordered_by_meta('your-key');

排序下降。

$yourvar = get_users_ordered_by_meta('your-key', 'desc');

您将像以前一样返回一系列对象,因此,我假设您知道如何循环浏览该数据并将其适当以显示等等...(如果没有,请发表评论)。

其他提示

尝试 :

global $wpdb;
$gather_users = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE $wpdb->usermeta.meta_key = 'META_KEY_HERE' ORDER BY $wpdb->usermeta.meta_value ASC");
$all_users = $wpdb->get_results($gather_users);
return $all_users;

并将meta_key_here更改为您的元密钥

你们做的工作太多了: https://codex.wordpress.org/class_reference/wp_user_query

$args = array(
    'meta_query' => array(
        array(
            array(
                'key'     => 'YOUR_KEY',
                'value'   => 'whatever_value_you\'re_looking_for',
                'compare' => '='
            )
        )
    )
 );
$user_query = new WP_User_Query( $args );

像其他WP {{QUERY}}类型约定一样,您可以订购,限制结果计数等...

https://codex.wordpress.org/class_reference/wp_user_query

编辑 - 警告:这是假设您将自定义用户数据分配给WP_CORE预期的用户表 - 在OP中,它看起来像您。对于自定义表,您将要使用另一个用户描述的$ WPDB方法

许可以下: CC-BY-SA归因
scroll top