diff --git a/src/wp-includes/nav-menu-template.php b/src/wp-includes/nav-menu-template.php index de37cb3451..8895476985 100644 --- a/src/wp-includes/nav-menu-template.php +++ b/src/wp-includes/nav-menu-template.php @@ -334,6 +334,7 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { $possible_object_parents = array_filter( $possible_object_parents ); $front_page_url = home_url(); + $front_page_id = (int) get_option( 'page_on_front' ); foreach ( (array) $menu_items as $key => $menu_item ) { @@ -344,6 +345,11 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { $classes[] = 'menu-item-type-' . $menu_item->type; $classes[] = 'menu-item-object-' . $menu_item->object; + // This menu item is set as the 'Front Page'. + if ( 'post_type' === $menu_item->type && $front_page_id === (int) $menu_item->object_id ) { + $classes[] = 'menu-item-home'; + } + // if the menu item corresponds to a taxonomy term for the currently-queried non-hierarchical post object if ( $wp_query->is_singular && 'taxonomy' == $menu_item->type && in_array( $menu_item->object_id, $possible_object_parents ) ) { $active_parent_object_ids[] = (int) $menu_item->object_id; @@ -377,10 +383,6 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { $classes[] = 'current_page_item'; } - if ( 'page_on_front' ) { - $classes[] = 'menu-item-home'; - } - $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; $active_parent_object_ids[] = (int) $menu_item->post_parent; $active_object = $menu_item->object; diff --git a/tests/phpunit/tests/post/nav-menu.php b/tests/phpunit/tests/post/nav-menu.php index 83edce53cb..017a5e5c79 100644 --- a/tests/phpunit/tests/post/nav-menu.php +++ b/tests/phpunit/tests/post/nav-menu.php @@ -444,4 +444,83 @@ class Test_Nav_Menus extends WP_UnitTestCase { $this->assertTrue( is_object( $args ) ); return $ignored_1; } + + + /** + * @ticket 35272 + */ + function test_no_front_page_class_applied() { + $page_id = self::factory()->post->create( array( 'post_type' => 'page', 'post_title' => 'Home Page' ) ); + + wp_update_nav_menu_item( $this->menu_id, 0, array( + 'menu-item-type' => 'post_type', + 'menu-item-object' => 'page', + 'menu-item-object-id' => $page_id, + 'menu-item-status' => 'publish', + )); + + $menu_items = wp_get_nav_menu_items( $this->menu_id ); + _wp_menu_item_classes_by_context( $menu_items ); + + $classes = $menu_items[0]->classes; + + $this->assertNotContains( 'menu-item-home', $classes ); + } + + + /** + * @ticket 35272 + */ + function test_class_applied_to_front_page_item() { + $page_id = self::factory()->post->create( array( 'post_type' => 'page', 'post_title' => 'Home Page' ) ); + update_option( 'page_on_front', $page_id ); + + wp_update_nav_menu_item( $this->menu_id, 0, array( + 'menu-item-type' => 'post_type', + 'menu-item-object' => 'page', + 'menu-item-object-id' => $page_id, + 'menu-item-status' => 'publish', + )); + + $menu_items = wp_get_nav_menu_items( $this->menu_id ); + _wp_menu_item_classes_by_context( $menu_items ); + + $classes = $menu_items[0]->classes; + + delete_option( 'page_on_front' ); + + $this->assertContains( 'menu-item-home', $classes ); + } + + /** + * @ticket 35272 + */ + function test_class_not_applied_to_taxonomies_with_same_id_as_front_page_item() { + global $wpdb; + + $new_id = 35272; + + $page_id = self::factory()->post->create( array( 'post_type' => 'page', 'post_title' => 'Home Page' ) ); + $tag_id = self::factory()->tag->create(); + + $wpdb->query( "UPDATE $wpdb->posts SET ID=$new_id WHERE ID=$page_id" ); + $wpdb->query( "UPDATE $wpdb->terms SET term_id=$new_id WHERE term_id=$page_id" ); + $wpdb->query( "UPDATE $wpdb->term_taxonomy SET term_id=$new_id WHERE term_id=$page_id" ); + + update_option( 'page_on_front', $new_id ); + + wp_update_nav_menu_item( $this->menu_id, 0, array( + 'menu-item-type' => 'taxonomy', + 'menu-item-object' => 'post_tag', + 'menu-item-object-id' => $new_id, + 'menu-item-status' => 'publish', + ) ); + + $menu_items = wp_get_nav_menu_items( $this->menu_id ); + _wp_menu_item_classes_by_context( $menu_items ); + + $classes = $menu_items[0]->classes; + + $this->assertNotContains( 'menu-item-home', $classes ); + } }