How can I list random authors from current post category?

The following lists authors of the current category.
But I want this to be a list of 6 random authors from current post category.

foreach((get_the_category()) as $category) {
  $postcat= $category->cat_ID;
 }

$current_category_ID = $postcat;
$current_cat_id = $current_category_ID;
$author_array = array();
$args = array(
'numberposts' => -1,
'cat' => $current_cat_id,
'orderby' => 'author',
'order' => 'asc',

);
$cat_posts = get_posts($args);
foreach ($cat_posts as $cat_post) :
if (!in_array($cat_post->post_author,$author_array)) {
$author_array[] = $cat_post->post_author;
}
endforeach;
foreach ($author_array as $author) :
$auth = get_userdata($author)->display_name;
$auth_link = get_userdata($author)->user_login;
$autid= get_userdata($author)->ID;
$link = get_author_posts_url($autid);
echo ''. get_avatar( $autid, '46' ).'';
echo "<a class="sidebar-aut" href="https://wordpress.stackexchange.com/questions/83825/$link";
echo "">";
echo '<h6>'.$auth.'</h6>';
echo "</a>";
echo "<div class="clearfix"></div>";
echo "<br />";
endforeach;

1 Answer
1

After you populate $author_array, you need to pick 6 random users out of it. Here are two straightforward choices:

  1. Shuffle the array shuffle($author_array); and pop values off of it in a for or while lopp using array_pop()
  2. Create a randomized copy of six elements of the array using array_rand($author_array,6); and then iterate through the new randomized array using foreach as you did above.

Personally I prefer #2, but please note that if you try to pick 6 random elements from an array of fewer than 6 elements with array_rand() you’ll get a warning. You’d want to test the size of $author_array with count($author_array) first to either limit your array_rand() command to the max size of the potential list of authors, or to skip it entirely if it’s 1.

Something like, after your first foreach ends:

if(count($author_array) >= 6) {
    $max = 6;
} else {
    $max = count($author_array);
}

$random_authors = array_rand($author_array,$max);
foreach ($random_authors as $author) { ...

Leave a Comment