[wp-trac] [WordPress Trac] #64835: Parent menu item is still rendered as dropdown when all submenu items are hidden

WordPress Trac noreply at wordpress.org
Tue Mar 10 11:59:43 UTC 2026


#64835: Parent menu item is still rendered as dropdown when all submenu items are
hidden
--------------------------+------------------------------
 Reporter:  benniledl     |       Owner:  (none)
     Type:  defect (bug)  |      Status:  new
 Priority:  normal        |   Milestone:  Awaiting Review
Component:  Editor        |     Version:
 Severity:  normal        |  Resolution:
 Keywords:                |     Focuses:
--------------------------+------------------------------

Comment (by khushipatel15):

 Can You check and add this code snippet.
 // File: wp-includes/blocks/navigation-link.php

 function render_block_core_navigation_link( $attributes, $content, $block
 ) {
     $parent_block = $block; // The current navigation-link block being
 rendered.

     // ... (existing attribute extraction and HTML markup generation for
 the <a> tag) ...

     // --- START PROPOSED FIX ---
     // Determine if this navigation link block has *any visible* inner
 navigation link blocks.
     // The navigation block structure is typically:
     // core/navigation-link (parent)
     //   -> core/submenus
     //      -> [core/navigation-link, core/navigation-link, ...]
 (children)
     $has_visible_submenu_items = false;
     if ( ! empty( $parent_block->inner_blocks ) ) {
         // Assume the first inner block is core/submenus.
         // This is a safe assumption for a valid navigation-link with
 children.
         $submenu_block = $parent_block->inner_blocks[0];

         if ( 'core/submenus' === $submenu_block->name && ! empty(
 $submenu_block->inner_blocks ) ) {
             foreach ( $submenu_block->inner_blocks as $child_link_block )
 {
                 if ( 'core/navigation-link' === $child_link_block->name )
 {
                     // Check the 'metadata.visibility' attribute of the
 child link block.
                     // Default to 'visible' if the attribute is not
 explicitly set.
                     $child_metadata   = isset(
 $child_link_block->parsed_block['attrs']['metadata'] ) ?
 $child_link_block->parsed_block['attrs']['metadata'] : array();
                     $child_visibility = isset(
 $child_metadata['visibility'] ) ? $child_metadata['visibility'] :
 'visible';

                     if ( 'hidden' !== $child_visibility ) {
                         $has_visible_submenu_items = true;
                         break; // Found at least one visible child, so
 this parent has a visible submenu.
                     }
                 }
             }
         }
     }

     // Replace the existing `$has_submenu = ! empty(
 $parent_block->inner_blocks );`
     // with the new logic based on visible children.
     $has_submenu = $has_visible_submenu_items;
     // --- END PROPOSED FIX ---

     // Add classes to the <li> element based on $has_submenu.
     $li_classes = array();
     if ( $has_submenu ) {
         $li_classes[] = 'has-link-submenu'; // This class often triggers
 dropdown styling.
         // Add other classes like 'wp-block-navigation-item--has-submenu'
 as needed.
     }
     // ... (further class processing for current item, etc.) ...

     // Build the content of the <li> element.
     $list_item_content = $block_markup . $attributes['label'] . '</a>'; //
 The <a> tag and label.

     if ( $has_submenu ) {
         // Add the submenu indicator arrow button.
         $list_item_content .= '<button aria-label="' . esc_attr__( 'Open
 submenu', 'default' ) . '" class="wp-block-navigation__submenu-icon wp-
 block-navigation-item__content-icon" data-wp-action="core#toggle" data-wp-
 on--click="actions.toggleMenuOnHover" data-wp-on--
 keydown="actions.toggleMenuOnHover" data-wp-bind--aria-
 expanded="state.isMenuOpen"></button>';
     }

     // Render inner blocks (the actual submenu). These will automatically
 filter based on their own visibility.
     $inner_blocks_content = '';
     foreach ( $parent_block->inner_blocks as $inner_block ) {
         // The core/submenus block itself also needs to ensure it only
 renders visible children,
         // but its render callback usually handles this.
         $inner_blocks_content .= $inner_block->render();
     }

     // Assemble the final list item HTML.
     return '<li class="' . esc_attr( implode( ' ', $li_classes ) ) . '">'
 . $list_item_content . $inner_blocks_content . '</li>';
 }

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/64835#comment:2>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list