[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