diff --git a/src/wp-includes/nav-menu-template.php b/src/wp-includes/nav-menu-template.php index d90fdfa8061ab..273672b008d35 100644 --- a/src/wp-includes/nav-menu-template.php +++ b/src/wp-includes/nav-menu-template.php @@ -435,14 +435,6 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { ) { $classes[] = 'current-menu-item'; $menu_items[ $key ]->current = true; - $ancestor_id = (int) $menu_item->db_id; - - while ( - ( $ancestor_id = (int) get_post_meta( $ancestor_id, '_menu_item_menu_item_parent', true ) ) - && ! in_array( $ancestor_id, $active_ancestor_item_ids, true ) - ) { - $active_ancestor_item_ids[] = $ancestor_id; - } if ( 'post_type' === $menu_item->type && 'page' === $menu_item->object ) { // Back compat classes for pages to match wp_page_menu(). @@ -451,10 +443,6 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { $classes[] = 'current_page_item'; } - $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; - $active_parent_object_ids[] = (int) $menu_item->post_parent; - $active_object = $menu_item->object; - // If the menu item corresponds to the currently queried post type archive. } elseif ( 'post_type_archive' === $menu_item->type @@ -499,22 +487,11 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { if ( $raw_item_url && in_array( $item_url, $matches, true ) ) { $classes[] = 'current-menu-item'; $menu_items[ $key ]->current = true; - $ancestor_id = (int) $menu_item->db_id; - - while ( - ( $ancestor_id = (int) get_post_meta( $ancestor_id, '_menu_item_menu_item_parent', true ) ) - && ! in_array( $ancestor_id, $active_ancestor_item_ids, true ) - ) { - $active_ancestor_item_ids[] = $ancestor_id; - } if ( in_array( home_url(), array( untrailingslashit( $current_url ), untrailingslashit( $_indexless_current ) ), true ) ) { // Back compat for home link to match wp_page_menu(). $classes[] = 'current_page_item'; } - $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; - $active_parent_object_ids[] = (int) $menu_item->post_parent; - $active_object = $menu_item->object; // Give front page item the 'current-menu-item' class when extra query arguments are involved. } elseif ( $item_url === $front_page_url && is_front_page() ) { @@ -526,6 +503,26 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { } } + // if current item, set active menu parent and ancestors. + if ( $menu_items[ $key ]->current ) { + $active_parent_item_ids[] = (int) $menu_item->menu_item_parent; + $active_parent_object_ids[] = (int) $menu_item->post_parent; + $active_object = $menu_item->object; + + $_anc_id = (int) $menu_item->menu_item_parent; + while ( + ! in_array( $_anc_id, $active_ancestor_item_ids ) + ) { + $active_ancestor_item_ids[] = $_anc_id; + foreach ( (array) $menu_items as $_key => $_parent ) { + if ( $_parent->db_id == $_anc_id ) { + $_anc_id = $_parent->menu_item_parent; + break; + } + } + } + } + // Back-compat with wp_page_menu(): add "current_page_parent" to static home page link for any non-page query. if ( ! empty( $home_page_id ) && 'post_type' === $menu_item->type && empty( $wp_query->is_page ) && $home_page_id === (int) $menu_item->object_id @@ -535,6 +532,7 @@ function _wp_menu_item_classes_by_context( &$menu_items ) { $menu_items[ $key ]->classes = array_unique( $classes ); } + $active_ancestor_item_ids = array_filter( array_unique( $active_ancestor_item_ids ) ); $active_parent_item_ids = array_filter( array_unique( $active_parent_item_ids ) ); $active_parent_object_ids = array_filter( array_unique( $active_parent_object_ids ) );