Order users by custom user meta

The question:

I’m showing a list of users like so:

<ul>

<?php   $directors = get_users('role=director'); 

        foreach ($directors as $director) { 

            $dir_id = $director->ID;

            $dir_order = get_user_meta($dir_id, 'exit_director_order', TRUE);

            $dir_link = get_bloginfo('home').'/?author='.$dir_id; 

            if ($dir_id == $director_id ) {

                $dir_class= 'current director-'.$dir_id;

            } else { 

                $dir_class= 'director-'.$dir_id;
            }
?>

           <li>
                <a href="<?php print $dir_link; ?>" rel="nofollow noreferrer noopener" class="<?php print $dir_class; ?>"><?php echo $director->display_name; ?></a><br>
           </li>


<?php } ?>


</ul>

I’d like to order the users by dir_order (in order of smallest number to largest). These values are stored in the database as integers.

How might I go about doing this?


EDIT:

Here’s the solution. Comments included:

<?php   $results = get_users('role=director'); 

        foreach ($results as $result) {

            // Get data about each user as an object
            $user = get_userdata($result->ID); 


            // Create a flat array with only the fields we need
            $directors[$user->ID] = array(
                'dir_order'     =>  $user->exit_director_order,
                'dir_id'        =>  $user->ID,
                'dir_name'      =>  $user->first_name.' '.$user->last_name        
            );
        }

        // Sort
        sort($directors); 

        // The list
        echo '<ul id="rightcolumndirector">';

        // For each result
        foreach ($directors as $director) { 

            // Set up the variables
            $dir_id = $director['dir_id'];
            $dir_order = $director['dir_order'];
            $dir_name = $director['dir_name'];
            $dir_link = get_bloginfo('home').'/?author='.$director['dir_id']; 


            // The list items
            echo '<li>';
            echo '<a href="'.$dir_link.'" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" id="dir-id-'.$dir_id.'">'.$dir_name.'</a>';
            echo '</li>';


        } 

        echo '</ul>';


?>

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

Here’s the solution. Comments included:

<?php   $results = get_users('role=director'); 

        foreach ($results as $result) {

            // Get data about each user as an object
            $user = get_userdata($result->ID); 


            // Create a flat array with only the fields we need
            $directors[$user->ID] = array(
                'dir_order'     =>  $user->exit_director_order,
                'dir_id'        =>  $user->ID,
                'dir_name'      =>  $user->first_name.' '.$user->last_name        
            );
        }

        // Sort
        sort($directors); 

        // The list
        echo '<ul id="rightcolumndirector">';

        // For each result
        foreach ($directors as $director) { 

            // Set up the variables
            $dir_id = $director['dir_id'];
            $dir_order = $director['dir_order'];
            $dir_name = $director['dir_name'];
            $dir_link = get_bloginfo('home').'/?author='.$director['dir_id']; 


            // The list items
            echo '<li>';
            echo '<a href="'.$dir_link.'" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" id="dir-id-'.$dir_id.'">'.$dir_name.'</a>';
            echo '</li>';


        } 

        echo '</ul>';


?>

Method 2

To get all users ordered by a custom meta field, set the meta_key and orderby meta_value or meta_value_num in this case.

$results = get_users( array(
    'role'       => 'director',
    'meta_key'   => 'exit_director_order',
    'orderby'    => 'meta_value_num',
    'order'      => 'ASC'
) );

EDIT: This appeared to work and SHOULD work. I believe it will work in the next version. But for now, it does not work.

The chosen answer here is the best option I have found until that time:
Ordering users of a specific role by last name


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment