In `paginate_links()`, don't override custom format arguments when setting up default 'add_args'.

Since 4.1 [29780], the default value of the 'add_args' argument in
paginate_links() has been determined by parsing the current URL. This change
had the side effect of overriding custom values of 'format' that changed the
pagination query var, with the result that plugins using `paginate_links()`
with a custom format generated the incorrect links unless explicitly
declaring 'add_args=false' to prevent the default values from overriding. We
fix this behavior by parsing URL query vars into the 'add_args' array only
after the explicit function params have been parsed, and by skipping the
current page's pagination query var when doing this parsing (to avoid the
override).

Props obenland.
Merges [31203], [31432] to the 4.1 branch.
Fixes #30831.

Built from https://develop.svn.wordpress.org/branches/4.1@31433


git-svn-id: http://core.svn.wordpress.org/branches/4.1@31414 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Dion Hulse 2015-02-12 02:20:22 +00:00
parent f7b1a10f47
commit e2825e3004
1 changed files with 24 additions and 11 deletions

View File

@ -2587,20 +2587,18 @@ function language_attributes($doctype = 'html') {
function paginate_links( $args = '' ) {
global $wp_query, $wp_rewrite;
$total = ( isset( $wp_query->max_num_pages ) ) ? $wp_query->max_num_pages : 1;
$current = ( get_query_var( 'paged' ) ) ? intval( get_query_var( 'paged' ) ) : 1;
// Setting up default values based on the current URL.
$pagenum_link = html_entity_decode( get_pagenum_link() );
$query_args = array();
$url_parts = explode( '?', $pagenum_link );
if ( isset( $url_parts[1] ) ) {
wp_parse_str( $url_parts[1], $query_args );
$query_args = urlencode_deep( $query_args );
}
// Get max pages and current page out of the current query, if available.
$total = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
$current = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1;
$pagenum_link = remove_query_arg( array_keys( $query_args ), $pagenum_link );
$pagenum_link = trailingslashit( $pagenum_link ) . '%_%';
// Append the format placeholder to the base URL.
$pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';
// URL base depends on permalink settings.
$format = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';
$format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%';
@ -2616,7 +2614,7 @@ function paginate_links( $args = '' ) {
'end_size' => 1,
'mid_size' => 2,
'type' => 'plain',
'add_args' => $query_args, // array of query args to add
'add_args' => array(), // array of query args to add
'add_fragment' => '',
'before_page_number' => '',
'after_page_number' => ''
@ -2624,6 +2622,21 @@ function paginate_links( $args = '' ) {
$args = wp_parse_args( $args, $defaults );
if ( ! is_array( $args['add_args'] ) ) {
$args['add_args'] = array();
}
// Merge additional query vars found in the original URL into 'add_args' array.
if ( isset( $url_parts[1] ) ) {
// Find the format argument.
$format_query = parse_url( str_replace( '%_%', $args['format'], $args['base'] ), PHP_URL_QUERY );
wp_parse_str( $format_query, $format_arg );
// Remove the format argument from the array of query arguments, to avoid overwriting custom format.
wp_parse_str( remove_query_arg( array_keys( $format_arg ), $url_parts[1] ), $query_args );
$args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $query_args ) );
}
// Who knows what else people pass in $args
$total = (int) $args['total'];
if ( $total < 2 ) {
@ -2638,7 +2651,7 @@ function paginate_links( $args = '' ) {
if ( $mid_size < 0 ) {
$mid_size = 2;
}
$add_args = is_array( $args['add_args'] ) ? $args['add_args'] : false;
$add_args = $args['add_args'];
$r = '';
$page_links = array();
$dots = false;