Support » Plugin: Co-Authors Plus » coauthors_wp_list_authors sorting and positioning

  • I’m using the coauthors_wp_list_authors function, and having two issues:

    1) Sorting. It would be great to be able to sort the co-authors alphabetically. Any tips on how to achieve that? “order” doesn’t seem to be a parameter on this function.

    2) I’m calling on this function using a custom shortcode:

    function display_authors() {
      $author_list = coauthors_wp_list_authors('number=500&echo=0');
      ?>
      <div class="author_list"><ul><?php return $author_list ?></ul></div><?php
    }

    The problem is the list of co-authors is always positioned on the page above the other content. And any other content I add is automatically inside that author_list div. It’s like the return is spitting out immediately and the div is not properly closing, or something. Any tips on how to fix this – or tips on other methods for displaying the list of authors? Thanks!

    My usage is: I have an authors page on which I want to display a list of all the co-authors.

    https://wordpress.org/plugins/co-authors-plus/

Viewing 9 replies - 1 through 9 (of 9 total)
  • Thread Starter blueskies

    (@blueskies)

    1) Regarding my question about sorting. These are the arguments:

    $defaults = array(
    		'optioncount'      => false,
    		'show_fullname'    => false,
    		'hide_empty'       => true,
    		'feed'             => '',
    		'feed_image'       => '',
    		'feed_type'        => '',
    		'echo'             => true,
    		'style'            => 'list',
    		'html'             => true,
    		'number'           => 20, // A sane limit to start to avoid breaking all the things
    	);
    
    	$args = wp_parse_args( $args, $defaults );
    	$return = '';
    
    	$term_args = array(
    			'orderby'      => 'name',
    			'hide_empty'   => 0,
    			'number'       => (int)$args['number'],
    		);

    I’m not sure why there’s an orderby in the $term_args but not in the $defaults. I’ve been trying to insert ‘order’ => ‘ASC’ into either of those arguments. But that’s not cutting it. Right now the list of names are sorted by when they were created. I would love to customize the order! Any help is appreciated.

    I used this to manually sort the display order by a vaule in the user profile. This method can be tedious for a large user count.I’m not the original author.

    Replace the args to your settings. But this should work with a little tweaking.

    $args  = array(
                   'blog_id' => '37',
                   'meta_query' => array(
    		            array(
                               'key'   => 'display_order', //My custom meta key to only display specific, handpicked authors
                               'value' => null,
                               'compare' => '!='
                             )
                     )
                  );
    
    $authors = get_users($args); // Get users satisfying our parameters
    
    function cmp($a, $b){  //The function to order our authors
       if ($a->display_order == $b->display_order) {  //This is where the name of our custom meta key is entered, I named mine "order"
    	    return 0;
        }
        return ($b->display_order > $a->display_order ) ? -1 : 1;  //The actual sorting is done here. Change ">" to "<" to reverse order
     }
    
     usort($authors, 'cmp');  //usort sorts our $users array with our function cmp()
    Thread Starter blueskies

    (@blueskies)

    Thanks for the reply, backbone. Yeah, sorting by value might be tough in my situation. We have many authors (it’s an academic journal that’s been around for 20 years), and the number is growing. I’ll consider this, though. I just wish it was a built in feature!

    Funny. I am looking to do the same thing. I submitted a [pull request to the repo](https://github.com/Automattic/Co-Authors-Plus/pull/239) for the ability to filter the author array returned from get_terms. If this gets pulled, it’d be as simple as adding a filter on coauthors_wp_list_authors_array and filtering that array into the order that you want it. Until then…

    I just replied to your SO post as well.

    Thread Starter blueskies

    (@blueskies)

    Wow, that looks remarkably simple. And I just checked the pull request, and it looks like they merged it!

    But now we have to wait for them to release an update with your code, right?

    Thanks for working on this!

    My pleasure. It was merged into VIP, it doesn’t look like they update this plugin as quickly. You can use composer and pull in the git repo if you are using it for dependency management.

    Thread Starter blueskies

    (@blueskies)

    I don’t do any dependency management (I’ll be off of this project soon, and those after me will have minimal tech expertise. Not that I’m a super expert, as you’ll see in a sec…).

    Could you explain, “as simple as adding a filter on coauthors_wp_list_authors_array and filtering that array into the order that you want it.” apply_filters() and add_filter() are kinda new to me.

    Would I add a function that’s something like:

    function coauthor_sort( $authors ) {
    some magic sorting;
    }
    add_filter('coauthors_wp_list_authors_array','coauthor_sort');

    ok so, this is untested but *should* work. it also may not be the most efficient way of doing things.

    This sorts by display_name if you want to sort by another property, change display_name to the property in the line

    $sorted[$item->display_name][] = $item;

    Note that both objects (the ‘mock’ user object and the WP_User object must have the same properties for this to work, also note how the WP_User object uses the magic method __get().

    function coauthor_sort( $authors ) {
    
        $sorted = array();
    
        foreach ($authors as $item) {
            $sorted[$item->display_name][] = $item;
        }
    
        uksort($sorted, "strnatcasecmp");
        $sorted_authors = array();
    
        foreach ($sorted as $subArray) {
            foreach ($subArray as $item)  {
                $sorted_authors[] = $item;
            }
        }
    
        return $sorted_authors;
    
    }
    add_filter('coauthors_wp_list_authors_array','coauthor_sort');

    Hope it helps.

    By the way, love the avatar, I was never able to kill that boss who’s head falls off when you punch him.

    Thread Starter blueskies

    (@blueskies)

    Sorry about the delay in responding. The holidays got away from me. I just added the function you posted above, and it worked perfectly! I didn’t have to touch it.

    Serendipitous that you were working on this at the exact same time as I (and that you know what you’re doing)!

Viewing 9 replies - 1 through 9 (of 9 total)
  • The topic ‘coauthors_wp_list_authors sorting and positioning’ is closed to new replies.