Pagination Help on Crazy Custom Authors Page

I’ve got a custom authors page for a multi-author blog.

http://blog.securitytechnologies.com/meet-the-team/

Read More

Here’s the code I’m using to generate the page (thanks to other folks in the support forums for providing it):

<?php
$excluded = "1,2,3,7,20,21";  // To exclude external admin author IDs
$sql = "SELECT DISTINCT post_author, umeta.meta_value as last_name
FROM $wpdb->posts
JOIN $wpdb->usermeta umeta ON ($wpdb->posts.post_author = umeta.user_id
AND umeta.meta_key = 'last_name')
WHERE post_author NOT IN ($excluded)
AND post_status = 'publish'
AND post_type = 'post'
ORDER BY last_name, post_author
";
$authors = $wpdb->get_results($sql);    
if($authors):
foreach($authors as $author):
?>    

What I can’t figure out is how to set a maximum number of authors per page and paginate. I’ve got WP-PageNavi installed, but I’m not having any luck implementing it here on a custom template page.

Thanks in advance.

Related posts

Leave a Reply

1 comment

  1. I doubt you’re going to be able to repurpose WP-PageNavi for this, since you’re not using the built-in queries at all. You should be able to roll pagination yourself, though, and still fall back on some of WordPress’s built-in functionality.

    In particular, if your URL matches the pattern /meet-the-team/page/3/, the paged querystring variable will automatically be filled with 3. You can use that, then just loop through the correct authors in your list. Here’s a bit of quick code:

    <?php
    $authors_per_page = 5;
    $page_number = preg_replace("/[^0-9]/", "", $_GET["paged"]); // don't trust querystring vars
    if (empty($page_number))
        $page_number = 1;
    
    $excluded = "1,2,3,7,20,21";  // To exclude external admin author IDs
    $sql = "..."; // SQL unchanged, omitted
    
    $authors = $wpdb->get_results($sql);    
    if ($authors) :
        $author_count = count($authors);
        $first_author = ($page_number - 1) * $authors_per_page;
        $last_author = min($first_author + $authors_per_page, $author_count);
    
        foreach ($i = $first_author; $i < $last_author; $i++) :
    ?>    
    
    <!-- display author -->
    
    <?php
        endforeach;
    
        // show previous and next page links
        if ($page_number > 1) {
            echo '<a href="/meet-the-team/page/' . ($page_number - 1) . '/">Previous page</a>';
        }
        if ($last_author < $author_count) {
            echo '<a href="/meet-the-team/page/' . ($page_number + 1) . '/">Next page</a>';
        }
    
    endif;
    ?>