I’m not sure. meta_value isn’t an indexed field in the database, so I’d be very surprised if this was supported in WordPress (it wouldn’t scale efficiently to a large site/database).
Yeah that’s a concern. I have a meta value for each user which is a score for that user so I have a need to show list of top 10 scores and stuff like that.
Using the WP API you can sort by meta_value on posts (WP_Query), but not on users (WP_User_Query).
You’d either have to do it in 2 passes, or write your own custom SQL statement.
If you have a lot of users, and scores change infrequently, you might want to consider caching your results for a period.
@djpaul @rogercoathup I was able to do it with the following code which seems to be a nice solution for scaling.
`<?php
//these are the arguments for the get_users function below
$args = array(
‘fields’ => ‘all_with_meta’,
‘role’ => ‘author’,
‘meta_query’ => array(
array(
‘key’ => ‘score’, // the meta field (or key) we want to target
)
));
//get_users calls WP_User_Query and returns an array of matching users
$users = get_users($args);
//custom function for comparing the data we want to sort by
function cmp($a, $b){
if ($a->score == $b->score) {
return 0;
}
return ($a->score > $b->score) ? -1 : 1;
}
//usort sorts our $users array with our function cmp()
usort($users, ‘cmp’);
//leaving an array of $users sorted by the value of meta ‘points’
foreach ($users as $user) {
echo ‘
‘;
echo get_avatar( $user->ID, 30 );
echo ‘‘ . $user->display_name . ‘‘;
echo ‘
‘;
} ?>`
@enderpal444 – thanks for posting your solution – that’s the sort of approach I was suggesting as ‘two pass’ – getting all the users unsorted, then sorting them, before iterating over them.
Efficiency might become an issue if your member numbers increase.
hi @enderpal444
I think i would use BP members loop to do what you want to do as you can send meta_key to BP_Core_User::get_users. Then i would take benefit of the filters included in the 2 sql to change its behavior. This is what i’ve tried to add a filtering by geo position to the main BP Members directory. I guess you’ll need to ask Roger and Paul about efficiency…
in the functions.php of my active theme > http://pastebin.com/2HKsSZCc
i tried to have a ‘one pass’ approach 