diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index 20855ae2c5..8d960fffcb 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -2447,26 +2447,32 @@ function paginate_links( $args = '' ) { ); $args = wp_parse_args( $args, $defaults ); - extract($args, EXTR_SKIP); // Who knows what else people pass in $args - $total = (int) $total; - if ( $total < 2 ) + $total = (int) $args['total']; + if ( $total < 2 ) { return; - $current = (int) $current; - $end_size = 0 < (int) $end_size ? (int) $end_size : 1; // Out of bounds? Make it the default. - $mid_size = 0 <= (int) $mid_size ? (int) $mid_size : 2; - $add_args = is_array($add_args) ? $add_args : false; + } + $current = (int) $args['current']; + $end_size = (int) $args['end_size']; // Out of bounds? Make it the default. + if ( $end_size < 1 ) { + $end_size = 1; + } + $mid_size = (int) $args['mid_size']; + if ( $mid_size < 0 ) { + $mid_size = 2; + } + $add_args = is_array( $args['add_args'] ) ? $args['add_args'] : false; $r = ''; $page_links = array(); $dots = false; - if ( $prev_next && $current && 1 < $current ) : - $link = str_replace('%_%', 2 == $current ? '' : $format, $base); - $link = str_replace('%#%', $current - 1, $link); + if ( $args['prev_next'] && $current && 1 < $current ) : + $link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%#%', $current - 1, $link ); if ( $add_args ) $link = add_query_arg( $add_args, $link ); - $link .= $add_fragment; + $link .= $args['add_fragment']; /** * Filter the paginated links for the given archive pages. @@ -2475,40 +2481,40 @@ function paginate_links( $args = '' ) { * * @param string $link The paginated link URL. */ - $page_links[] = ''; + $page_links[] = ''; endif; for ( $n = 1; $n <= $total; $n++ ) : if ( $n == $current ) : - $page_links[] = "" . $before_page_number . number_format_i18n( $n ) . $after_page_number . ""; + $page_links[] = "" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . ""; $dots = true; else : - if ( $show_all || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : - $link = str_replace('%_%', 1 == $n ? '' : $format, $base); - $link = str_replace('%#%', $n, $link); + if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : + $link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%#%', $n, $link ); if ( $add_args ) $link = add_query_arg( $add_args, $link ); - $link .= $add_fragment; + $link .= $args['add_fragment']; /** This filter is documented in wp-includes/general-template.php */ - $page_links[] = "" . $before_page_number . number_format_i18n( $n ) . $after_page_number . ""; + $page_links[] = "" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . ""; $dots = true; - elseif ( $dots && !$show_all ) : + elseif ( $dots && ! $args['show_all'] ) : $page_links[] = '' . __( '…' ) . ''; $dots = false; endif; endif; endfor; - if ( $prev_next && $current && ( $current < $total || -1 == $total ) ) : - $link = str_replace('%_%', $format, $base); - $link = str_replace('%#%', $current + 1, $link); + if ( $args['prev_next'] && $current && ( $current < $total || -1 == $total ) ) : + $link = str_replace( '%_%', $args['format'], $args['base'] ); + $link = str_replace( '%#%', $current + 1, $link ); if ( $add_args ) $link = add_query_arg( $add_args, $link ); - $link .= $add_fragment; + $link .= $args['add_fragment']; /** This filter is documented in wp-includes/general-template.php */ - $page_links[] = ''; + $page_links[] = ''; endif; - switch ( $type ) { + switch ( $args['type'] ) { case 'array' : return $page_links; diff --git a/tests/phpunit/tests/general/paginateLinks.php b/tests/phpunit/tests/general/paginateLinks.php new file mode 100644 index 0000000000..034a434f0a --- /dev/null +++ b/tests/phpunit/tests/general/paginateLinks.php @@ -0,0 +1,82 @@ +1 + +50 +EXPECTED; + + $links = paginate_links( array( 'total' => 50 ) ); + $this->assertEquals( $expected, $links ); + } + + function test_format() { + $expected =<<1 + +50 +EXPECTED; + + $links = paginate_links( array( 'total' => 50, 'format' => '/page/%#%/' ) ); + $this->assertEquals( $expected, $links ); + } + + function test_prev_next_false() { + $expected =<<1 +2 +3 +4 + +50 +EXPECTED; + + $links = paginate_links( array( 'total' => 50, 'prev_next' => false, 'current' => 2 ) ); + $this->assertEquals( $expected, $links ); + } + + function test_prev_next_true() { + $expected =<<« Previous +1 +2 +3 +4 + +50 + +EXPECTED; + + $links = paginate_links( array( 'total' => 50, 'prev_next' => true, 'current' => 2 ) ); + $this->assertEquals( $expected, $links ); + } + + function increment_i18n_count() { + $this->i18n_count += 1; + } + + /** + * @ticket 25735 + */ + function test_paginate_links_number_format() { + $this->i18n_count = 0; + add_filter( 'number_format_i18n', array( $this, 'increment_i18n_count' ) ); + paginate_links( array( + 'total' => 100, + 'current' => 50, + 'show_all' => false, + 'prev_next' => true, + 'end_size' => 1, + 'mid_size' => 1, + ) ); + // The links should be: + // < Previous 1 ... 49 50 51 ... 100 Next > + $this->assertEquals( 5, $this->i18n_count ); + remove_filter( 'number_format_i18n', array( $this, 'increment_i18n_count' ) ); + } +} diff --git a/tests/phpunit/tests/general/template.php b/tests/phpunit/tests/general/template.php deleted file mode 100644 index 101118724c..0000000000 --- a/tests/phpunit/tests/general/template.php +++ /dev/null @@ -1,31 +0,0 @@ -i18n_count += 1; - } - - /** - * @ticket 25735 - */ - function test_paginate_links_number_format() { - $this->i18n_count = 0; - add_filter( 'number_format_i18n', array( $this, 'increment_i18n_count' ) ); - paginate_links( array( - 'total' => 100, - 'current' => 50, - 'show_all' => false, - 'prev_next' => true, - 'end_size' => 1, - 'mid_size' => 1, - ) ); - // The links should be: - // < Previous 1 ... 49 50 51 ... 100 Next > - $this->assertEquals( 5, $this->i18n_count ); - remove_filter( 'number_format_i18n', array( $this, 'increment_i18n_count' ) ); - } - -}