Make WordPress Core

Changeset 41008


Ignore:
Timestamp:
07/05/2017 09:30:30 PM (9 years ago)
Author:
SergeyBiryukov
Message:

Menus: Make sure current-menu-parent and current-menu-ancestor classes are properly set for parent items of post type archive submenu items.

Props mrwweb, ajoah, welcher.
Fixes #39800.

Location:
trunk
Files:
2 edited

Legend:

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

    r40969 r41008  
    395395                        $classes[] = 'current-menu-item';
    396396                        $menu_items[$key]->current = true;
     397                        $_anc_id = (int) $menu_item->db_id;
     398
     399                        while(
     400                                ( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&
     401                                ! in_array( $_anc_id, $active_ancestor_item_ids )
     402                        ) {
     403                                $active_ancestor_item_ids[] = $_anc_id;
     404                        }
     405
     406                        $active_parent_item_ids[] = (int) $menu_item->menu_item_parent;
     407
    397408                // if the menu item corresponds to the currently-requested URL
    398409                } elseif ( 'custom' == $menu_item->object && isset( $_SERVER['HTTP_HOST'] ) ) {
  • trunk/tests/phpunit/tests/post/nav-menu.php

    r40676 r41008  
    554554                $this->assertNotInstanceOf( 'WP_Post', get_post( $nav_created_post_ids[1] ) );
    555555        }
     556
     557        /**
     558         * @ticket 39800
     559         */
     560        function test_parent_ancestor_for_post_archive() {
     561
     562                register_post_type( 'books', array( 'label' => 'Books', 'public' => true, 'has_archive' => true ) );
     563
     564                $first_page_id  = self::factory()->post->create( array( 'post_type' => 'page', 'post_title' => 'Top Level Page' ) );
     565                $second_page_id = self::factory()->post->create( array( 'post_type' => 'page', 'post_title' => 'Second Level Page' ) );
     566
     567
     568                $first_menu_id = wp_update_nav_menu_item( $this->menu_id, 0, array(
     569                        'menu-item-type'      => 'post_type',
     570                        'menu-item-object'    => 'page',
     571                        'menu-item-object-id' => $first_page_id,
     572                        'menu-item-status'    => 'publish',
     573                ));
     574
     575                $second_menu_id = wp_update_nav_menu_item( $this->menu_id, 0, array(
     576                        'menu-item-type'      => 'post_type',
     577                        'menu-item-object'    => 'page',
     578                        'menu-item-object-id' => $second_page_id,
     579                        'menu-item-status'    => 'publish',
     580                        'menu-item-parent-id' => $first_menu_id
     581                ));
     582
     583                wp_update_nav_menu_item( $this->menu_id, 0, array(
     584                        'menu-item-type'      => 'post_type_archive',
     585                        'menu-item-object'    => 'books',
     586                        'menu-item-status'    => 'publish',
     587                        'menu-item-parent-id' => $second_menu_id
     588                ));
     589
     590                $this->go_to( get_post_type_archive_link( 'books' ) );
     591
     592                $menu_items = wp_get_nav_menu_items( $this->menu_id );
     593                _wp_menu_item_classes_by_context( $menu_items );
     594
     595                $top_page_menu_item       = $menu_items[0];
     596                $secondary_page_menu_item = $menu_items[1];
     597                $post_archive_menu_item   = $menu_items[2];
     598
     599                $this->assertFalse( $top_page_menu_item->current_item_parent );
     600                $this->assertTrue( $top_page_menu_item->current_item_ancestor );
     601                $this->assertContains( 'current-menu-ancestor', $top_page_menu_item->classes );
     602
     603                $this->assertTrue( $secondary_page_menu_item->current_item_parent );
     604                $this->assertTrue( $secondary_page_menu_item->current_item_ancestor  );
     605                $this->assertContains( 'current-menu-parent', $secondary_page_menu_item->classes );
     606                $this->assertContains( 'current-menu-ancestor', $secondary_page_menu_item->classes );
     607
     608                $this->assertFalse( $post_archive_menu_item->current_item_parent );
     609                $this->assertFalse( $post_archive_menu_item->current_item_ancestor  );
     610
     611                $this->assertNotContains( 'current-menu-parent', $post_archive_menu_item->classes );
     612                $this->assertNotContains( 'current-menu-ancestor', $post_archive_menu_item->classes );
     613        }
     614
    556615}
Note: See TracChangeset for help on using the changeset viewer.