I’m using the following code to generate some pagination:
$wp_query = new WP_Query();
$wp_query->query('posts_per_page=5'.'&paged='.$paged);
$big = 999999999;
echo '<div class="pagination">';
echo paginate_links(array( 'base' => '%_%',
'format' => str_replace($big, '%#%', esc_url(get_pagenum_link( $big ))),
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'end_size' =>4,
'type' => 'list'));
echo '</div>';
Its generating my links correctly on the first page, but if I go to any other page everything is still correct except the link for page 1 is always the url of whatever page I am on. Seems like I’m missing somthing simple, anyone know a fix?
3 Answers
Short answer:
Try
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
Long answer:
I took a look at the paginate_links()
source code (v3.5.1) and there is this line (#)
$link = str_replace('%_%', 1 == $n ? '' : $format, $base);
that is giving you the empty first page link.
With your setup you have $base = "%_%"
and $format = "http://example.com/page/%#%/"
so this becomes:
$link = str_replace('%_%', 1 == $n ? '' : "http://example.com/page/%#%/", "%_%");
where we have two cases:
n=1: $link = str_replace('%_%', '', "%_%");
n>1: $link = str_replace('%_%', "http://example.com/page/%#%/", "%_%");
and after the replacement:
n=1: $link = '';
n>1: $link = "http://example.com/page/%#%/";
Here is an example of the output from paginate_links()
:
<ul class="page-numbers">
<li><a class="prev page-numbers" href="http://example.com/page/2/">« Previous</a></li>
<li><a class="page-numbers" href="">1</a></li>
<li><a class="page-numbers" href="http://example.com/page/2/">2</a></li>
<li><span class="page-numbers current">3</span></li>
<li><a class="page-numbers" href="http://example.com/page/4/">4</a></li>
<li><a class="page-numbers" href="http://example.com/page/5/">5</a></li>
<li><a class="page-numbers" href="http://example.com/page/6/">6</a></li>
<li><a class="next page-numbers" href="http://example.com/page/4/">Next »</a></li>
</ul>
If you use instead (#):
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
then you get:
$link = str_replace('%_%', 1 == $n ? '' : "?paged=%#%", "http://example.com/page/%#%");
Since no replacement will take place
$link = "http://example.com/page/%#%";
in both cases (n=1 and n>1) and you have a non empty first page link with the output of paginate_links()
:
<ul class="page-numbers">
<li><a class="prev page-numbers" href="http://example.com/page/2/">« Previous</a></li>
<li><a class="page-numbers" href="http://example.com/page/1/">1</a></li>
<li><a class="page-numbers" href="http://example.com/page/2/">2</a></li>
<li><span class="page-numbers current">3</span></li>
<li><a class="page-numbers" href="http://example.com/page/4/">4</a></li>
<li><a class="page-numbers" href="http://example.com/page/5/">5</a></li>
<li><a class="page-numbers" href="http://example.com/page/6/">6</a></li>
<li><a class="next page-numbers" href="http://example.com/page/4/">Next »</a></li>
</ul>
To have a non empty first page link it looks like $format
can be any string as long as $base
doesn’t include the string "%_%"
, i.e. these should work fine:
'format' => '?paged=%#%',
'format' => 'page/%#%',
'format' => 'asdfasdfasdfasdfasdf',
If you don’t use permalinks, then the example in (#) will also give you non empty first page link since
$link = str_replace('%_%', 1 == $n ? '' : "?paged=%#%", "http://example.com/?paged=%#%");
with replacements.