Reputation: 615
I am trying to order some data by 'rand' on a foreach loop I have created which is outputting some users which I have created a custom role for. all the other bits are great apart from this.
This is the current state of the loop:
<?php
// Featured Consultants
$consultants = get_users( 'role=consultant&number=2' );
// Array of WP_User objects.
foreach ( $consultants as $consultant ) {
// Check for 'featured' Consultants
if($consultant->featured == 'Yes'){
echo '<div class="columns six consultantCard">';
echo '<div class="columns four">';
echo get_avatar( $consultant->id, 150 );
echo '</div>';
echo '<div class="columns eight">';
// Get users details
echo '<span class="name">' . esc_html( $consultant->first_name ) . ' ' . esc_html( $consultant->last_name ) . '</span>';
echo '<span class="jobTitle">' . esc_html( $consultant->job_title ) . '</span>';
echo '<span class="location">Currently based in ' . esc_html( $consultant->current_location ) . '</span>';
// Check if user is less than 30 days old
if( strtotime($consultant->user_registered) < strtotime('30 days') ){
echo '<span class="newTag">New</span>';
}
// Check if user is featured
if($consultant->featured == 'Yes'){
echo '<span class="featuredTag">Featured Candiate</span>';
}
// Check if user is accredited
if($consultant->accredited == 'Yes'){ ?>
<span class="icon"><img src="<?php bloginfo('template_url');?>/assets/img/icons/accreditedIcon.png" /></span>
<?php echo '<span class="accreditedTag">Bench Accredited</span>';
}
echo '</div>';
echo '</div>';
} else{
echo 'No Featured Consultants';
}
}
?>
It just appears to be showing the latest entries and nothing more. I tried to also create an array but still the same result like so:
$consultant = array(
'role' => 'consultant',
'order' => 'rand'
);
Upvotes: 0
Views: 631
Reputation: 4880
We can use the get_users()
to get a list of authors, users with a specific role, a user with specific meta, etc. The function returns users which can be ordered by ID, login, nickname, email, URL, registered, display_name, post_count, or meta_value. But there is no random option such as what get_posts()
function provides to shows posts randomly.
Since the get_users()
function uses WP_User_Query
class, there is an action hook pre_user_query we can use to modify the class variable. The idea is using our own 'rand' order by the parameter. If we put 'rand' to the orderby parameter, user_login
will be used instead. In this case, we need to replace it with RAND()
to result in users randomly. In this example below, we I ‘rand’ and you can use your own order by name.
// Add this code in your function.php
add_action( 'pre_user_query', 'my_random_user_query' );
function my_random_user_query( $class ) {
if( 'rand' == $class->query_vars['orderby'] )
$class->query_orderby = str_replace( 'user_login', 'RAND()', $class->query_orderby );
return $class;
}
The WP_User_Query
contains order by query and the our arguments. Now, we have a new order by parameter to WordPress.
$users = get_users( array(
'orderby' => 'rand',
'number' => 5
));
print_r( $users );
Upvotes: 1