Pagination problem in custom post type used as front page

It is hard to say with 100% certainty but I think the problem is your use of query_posts. Here is what I believe is happening:

  1. The Main query runs with the default parameters and loads your page
  2. You clobber the main query with query_posts
  3. You generate pagination based on the clobbered main query
  4. You click a link
  5. The unclobbered main query tries to sort out what you want (remember, your query_posts can’t run until WordPress loads the template)
  6. And fails and you get a 404

Just don’t use query_posts. If you ever think you have found a legitimate place to use query_posts you are almost certainly wrong. The Core is the only thing that should be running that function.

If you must alter the main query use a filter on pre_get_posts.

function alter_query_wpse_99042($qry) {
  $qry->set('posts_per_page',6);
  $qry->set('post_type','portfolio');
}
add_action('pre_get_posts','alter_query_wpse_99042');

However, based on your post type registration settings it looks like WordPress should be building the archive for you. I am not sure why you need to be constructing a query at all, except maybe to change posts_per_page. You can customize the generated archive by making a file named archive-portfolio.php and saving it to the theme directory. single-portfolio.php does the same with single post-type displays. Those files are loaded automatically.

Leave a Comment