WordPress.org

Make WordPress Core

Ticket #30831: 30831.2.diff

File 30831.2.diff, 5.0 KB (added by obenland, 6 years ago)
  • src/wp-includes/general-template.php

     
    25862586function paginate_links( $args = '' ) {
    25872587        global $wp_query, $wp_rewrite;
    25882588
    2589         $total        = ( isset( $wp_query->max_num_pages ) ) ? $wp_query->max_num_pages : 1;
    2590         $current      = ( get_query_var( 'paged' ) ) ? intval( get_query_var( 'paged' ) ) : 1;
     2589        // Setting up default values based on the current URL.
    25912590        $pagenum_link = html_entity_decode( get_pagenum_link() );
    2592         $query_args   = array();
    2593         $url_parts    = explode( '?', $pagenum_link );
    25942591
    2595         if ( isset( $url_parts[1] ) ) {
    2596                 wp_parse_str( $url_parts[1], $query_args );
    2597                 $query_args = urlencode_deep( $query_args );
    2598         }
     2592        // If the current query knows its maximum number of pages, use that.
     2593        $total = ( isset( $wp_query->max_num_pages ) ) ? $wp_query->max_num_pages : 1;
    25992594
    2600         $pagenum_link = remove_query_arg( array_keys( $query_args ), $pagenum_link );
    2601         $pagenum_link = trailingslashit( $pagenum_link ) . '%_%';
     2595        // If the default format argument is available, use it to determine the current page.
     2596        $current = ( get_query_var( 'paged' ) ) ? intval( get_query_var( 'paged' ) ) : 1;
    26022597
     2598        // Split the current URL to get the query component.
     2599        $url_parts = explode( '?', $pagenum_link );
     2600
     2601        // Append the format placeholder to the base URL.
     2602        $pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';
     2603
     2604        // If we're using index permalinks, start with that.
    26032605        $format  = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';
     2606        // Use pretty permalinks if applicable, otherwise just a query argument for the page number placeholder.
    26042607        $format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%';
    26052608
    26062609        $defaults = array(
     
    26152618                'end_size' => 1,
    26162619                'mid_size' => 2,
    26172620                'type' => 'plain',
    2618                 'add_args' => $query_args, // array of query args to add
     2621                'add_args' => array(), // array of query args to add
    26192622                'add_fragment' => '',
    26202623                'before_page_number' => '',
    26212624                'after_page_number' => ''
     
    26232626
    26242627        $args = wp_parse_args( $args, $defaults );
    26252628
     2629        // Filter query arguments only if there are any.
     2630        if ( isset( $url_parts[1] ) ) {
     2631                // Find the format argument.
     2632                $format_query = parse_url( str_replace( '%_%', $args['format'], $args['base'] ), PHP_URL_QUERY );
     2633                wp_parse_str( $format_query, $format_arg );
     2634
     2635                // Remove the format argument from the array of query arguments.
     2636                wp_parse_str( remove_query_arg( array_keys( $format_arg ), $url_parts[1] ), $query_args );
     2637                $args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $query_args ) );
     2638        }
     2639
    26262640        // Who knows what else people pass in $args
    26272641        $total = (int) $args['total'];
    26282642        if ( $total < 2 ) {
  • tests/phpunit/tests/general/paginateLinks.php

     
    229229                        $this->assertEquals( $expected_href, $href );
    230230                }
    231231        }
     232
     233        /**
     234         * @ticket 30831
     235         */
     236        function test_paginate_links_with_custom_query_args() {
     237                add_filter( 'get_pagenum_link', array( $this, 'add_query_arg' ) );
     238                $links = paginate_links( array(
     239                        'current'  => 2,
     240                        'total'    => 5,
     241                        'end_size' => 1,
     242                        'mid_size' => 1,
     243                        'type'     => 'array',
     244                        'add_args' => array(
     245                                'baz' => 'qux',
     246                        ),
     247                ) );
     248                remove_filter( 'get_pagenum_link', array( $this, 'add_query_arg' ) );
     249
     250                $document = new DOMDocument();
     251                $document->preserveWhiteSpace = false;
     252
     253                $data = array(
     254                        0 => home_url( '/?baz=qux&foo=bar&s=search+term' ),
     255                        1 => home_url( '/?baz=qux&foo=bar&s=search+term' ),
     256                        3 => home_url( '/?paged=3&baz=qux&foo=bar&s=search+term' ),
     257                        5 => home_url( '/?paged=5&baz=qux&foo=bar&s=search+term' ),
     258                        6 => home_url( '/?paged=3&baz=qux&foo=bar&s=search+term' ),
     259                );
     260
     261                foreach ( $data as $index => $expected_href ) {
     262                        $document->loadHTML( $links[ $index ] );
     263                        $tag = $document->getElementsByTagName( 'a' )->item( 0 );
     264                        $this->assertNotNull( $tag );
     265
     266                        $href = $tag->attributes->getNamedItem( 'href' )->value;
     267                        $this->assertEquals( $expected_href, $href );
     268                }
     269        }
     270
     271        /**
     272         * @ticket 30831
     273         */
     274        public function test_paginate_links_should_allow_non_default_format_without_add_args() {
     275                // Fake the query params.
     276                $request_uri = $_SERVER['REQUEST_URI'];
     277                $_SERVER['REQUEST_URI'] = add_query_arg( 'foo', 3, home_url() );
     278
     279                $links = paginate_links( array(
     280                        'base'    => add_query_arg( 'foo', '%#%' ),
     281                        'format'  => '',
     282                        'total'   => 5,
     283                        'current' => 3,
     284                        'type'    => 'array',
     285                ) );
     286
     287                $this->assertContains( '?foo=1', $links[1] );
     288                $this->assertContains( '?foo=2', $links[2] );
     289                $this->assertContains( '?foo=4', $links[4] );
     290                $this->assertContains( '?foo=5', $links[5] );
     291
     292                $_SERVER['REQUEST_URI'] = $request_uri;
     293        }
    232294}