Make WordPress Core

Changeset 42732


Ignore:
Timestamp:
02/24/2018 01:43:07 PM (7 years ago)
Author:
SergeyBiryukov
Message:

Menus: When checking if a Custom Link matches the current URL to add the current-menu-item class, check for decoded URL as well.

Props soulseekah, campusboy1987.
Fixes #43401.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/nav-menu-template.php

    r42343 r42732  
    442442                $_root_relative_current = strtok( untrailingslashit( $_SERVER['REQUEST_URI'] ), '?' );
    443443            }
     444
    444445            $current_url        = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_root_relative_current );
    445446            $raw_item_url       = strpos( $menu_item->url, '#' ) ? substr( $menu_item->url, 0, strpos( $menu_item->url, '#' ) ) : $menu_item->url;
     
    447448            $_indexless_current = untrailingslashit( preg_replace( '/' . preg_quote( $wp_rewrite->index, '/' ) . '$/', '', $current_url ) );
    448449
    449             if ( $raw_item_url && in_array( $item_url, array( $current_url, $_indexless_current, $_root_relative_current ) ) ) {
     450            $matches = array(
     451                $current_url,            urldecode( $current_url ),
     452                $_indexless_current,     urldecode( $_indexless_current ),
     453                $_root_relative_current, urldecode( $_root_relative_current ),
     454            );
     455
     456            if ( $raw_item_url && in_array( $item_url, $matches ) ) {
    450457                $classes[]                   = 'current-menu-item';
    451458                $menu_items[ $key ]->current = true;
  • trunk/tests/phpunit/tests/post/nav-menu.php

    r42636 r42732  
    763763    }
    764764
     765    /**
     766     * Provides IRI matching data for _wp_menu_item_classes_by_context() test.
     767     */
     768    function get_iri_current_menu_items() {
     769        return array(
     770            array( site_url( '/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82/' ) ),
     771            array( site_url( '/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82' ) ),
     772            array( '/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82/' ),
     773            array( '/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82' ),
     774            array( '/привет/' ),
     775            array( '/привет' ),
     776        );
     777    }
     778
     779    /**
     780     * @ticket 43401
     781     * @dataProvider get_iri_current_menu_items
     782     */
     783    function test_iri_current_menu_item( $custom_link, $current = true ) {
     784        wp_update_nav_menu_item(
     785            $this->menu_id, 0, array(
     786                'menu-item-status' => 'publish',
     787                'menu-item-type'   => 'custom',
     788                'menu-item-url'    => $custom_link,
     789            )
     790        );
     791
     792        $this->go_to( site_url( '/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82/' ) );
     793
     794        $menu_items = wp_get_nav_menu_items( $this->menu_id );
     795        _wp_menu_item_classes_by_context( $menu_items );
     796
     797        $classes = $menu_items[0]->classes;
     798
     799        if ( $current ) {
     800            $this->assertContains( 'current-menu-item', $classes );
     801        } else {
     802            $this->assertNotContains( 'current-menu-item', $classes );
     803        }
     804    }
     805
    765806}
Note: See TracChangeset for help on using the changeset viewer.