Tag Archives: $query

[WordPress] Get pagination to work on author page (author.php)

Important

This post is not about adding WP-PageNavi plugin, but how to get it to work on author page.

Let say that we use in our WordPress 2 post types, one ‘post’ to write posts, and second ‘articles’ to write some articles…

Now, on author page we wanna list all posts and articles written author, show them in separate sections, and display cute pagination under sections to don’t load hundrets entries on one page.

We will query them using query_posts, as follow:

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
 
// Query articles of author
query_posts( array( 'post_type' => 'articles', 'post_status' => 'publish', 'author' => $curauth->ID, 'paged' => $paged ) );
// ... some code to loop and print
 
// Query posts of author
query_posts( array( 'post_type' => 'post', 'post_status' => 'publish', 'author' => $curauth->ID, 'paged' => $paged ) );
// ... some code to loop and print

And everything should work fine until quantity of posts is bigger then articles, I mean pagination will work fine…

But if author will have for example written 5 posts and 15 articles, and we will try to get on page no. 2 – will see unfriendly 404 page!

Why?!

Because author main query is just for posts, and parameter max_num_pages does not allow second page – so we need to extend author main query with ‘articles’ post type.

Add new function to your “functions.php” template file, and assign to action pre_get_posts

function custom_author_archive( &$query ) {
    if ($query->is_author)
        $query->set( 'post_type', array( 'post', 'articles' ) );
}
add_action( 'pre_get_posts', 'custom_author_archive' );

Now, if we will enter to author page, will see strange thing, pagination working fine but both loops, display both ‘post’ and ‘articles’… it happen like this because our added action override parametres in query_posts call.

So, if author main query allow us to get on page number 2, we dont need this action anymore to modify other queries too…

To do this add in top of “author.php” template file instruction to remove this action from any other calls:

remove_action('pre_get_posts', 'custom_author_archive');

Refresh your author page, and enjoy WORKING pagination!