I’ve got custom template that I want to display paged blog posts. This is the beginning of my file:
$wp_query = new WP_Query($args);
if($wp_query->have_posts()){
while($wp_query->have_posts()){ $wp_query->the_post();
//something...
<?php next_posts_link('Older Entries'); ?>
<?php previous_posts_link('Newer Entries'); ?>
It works fine – it displays OLDER and NEWER links when it should. On the first page it will display only a link to older entires. On the second page both to newer entries and yet older ones etc.
But I don’t want to overwrite current $wp_query
… I want to use let’s say $wp_query2
for this loop. And the links don’t appear at all if I do this.
According to this: http://codex.wordpress.org/Function_Reference/next_posts_link they print a link to the prev/next set of posts within the current query. I assume that $wp_query2
isn’t my “CURRENT QUERY” but $wp_query
always is. Can I change that somehow?
UPDATE:
Adding &paged=2
manually to the link causes it to correctly go to the next set of posts (next page) and on second, third etc. page previous_posts_link()
works even if I use $wp_query2
. So, I’m just missing next_posts_link()
functionality on every page.
next_posts_link
andprevious_posts_link
use the global$wp_query
.That means you need to do something like this to get those to work correctly.
If you are done with
$wp_query
for that page load there is no reason to preserve it. It should be pretty easy to copy those core functions, modify them to accept a query parameter and create your own paging functions.Looking at the wordpress source, it looks like next_posts_link uses the global var $paged. My guess is that is only going to work for the primary loop.
A pretty good solution on how to make pagination work for secondary loops is here:
http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/
It involves setting the paged query var explicitly in the query, like this:
Hope that helps.
I ran into the same issue. I have nested loops, so in the inner loop I am using
$wp_query = new WP_Query($args);
instead of the globalWP_Query
. The solution I used was to explicitely passmax_num_pages
to thenext_posts_link
function. This has been mentioned in the comments by Andy Giesler as well.Solution:
The reason we have to do this is that wordpress internally use global WP_query’s
$max_page
property, which if is undefined then the default will be$max_page = 0