5

I have using the Wordpress paginate_links() to build a paginator on a custom archive template for a custom post type. My site uses permalinks:

<?php echo paginate_links(array(
    'base' => get_pagenum_link(1) . '%_%',
    'current' => max(1, get_query_var('paged')),
    'format' => 'page/%#%',
    'total' => $wp_query->max_num_pages,
)); ?>

This works fine until I try to add query string vars to build a custom search string when the paginator echoes:

.../entries?post_type=entry&s=testpage/1
.../entries?post_type=entry&s=testpage/2

Instead of:

.../entries/page/1?post_type=entry&s=test
.../entries/page/2?post_type=entry&s=test

and so on... How can I get the correctly formatted URLs?

1
  • What exactly is adding those vars?
    – Rarst
    Commented Oct 21, 2013 at 21:05

2 Answers 2

9

Seems that the query string is coming from the base argument call to get_pagenum_link() so I have removed the query string component and re-add it with 'add_args'. Like so:

<?php echo paginate_links(array(
     'base' => preg_replace('/\?.*/', '/', get_pagenum_link(1)) . '%_%',
     'current' => max(1, get_query_var('paged')),
     'format' => 'page/%#%',
     'total' => $wp_query->max_num_pages,
     'add_args' => array(
         's' => get_query_var('s'),
         'post_type' => get_query_var('post_type'),
     )
 )); ?>
1
  • A small change near 'format', I recommend to add slash at the end for building the right links: 'format' => 'page/%#%/', Commented Sep 7, 2018 at 10:19
1

The following works for pages with any query-vars. If you visit
example.com/blog/?foo=bar&baz the link for the next page will have the same query-vars set: example.com/blog/page/1/?foo=bar&baz.

$link_unescaped = get_pagenum_link( 1, false ); // esc=false so parse_url works.
$url_components = wp_parse_url( $link_unescaped );
$add_args       = array();
if ( isset( $url_components['query'] ) ) {
    wp_parse_str( $url_components['query'], $add_args ); // $add_args is updated.
}

echo paginate_links(
    array(
        'base'      => strtok( $link_unescaped, '?' ) . '%_%',
        'format'    => 'page/%#%/',
        'current'   => max( 1, get_query_var( 'paged' ) ),
        'total'     => $query->max_num_pages,
        'add_args'  => $add_args,
    )
);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.