run:R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:52
R W Run
DIR
2026-03-11 16:18:51
R W Run
DIR
2026-03-11 16:18:51
R W Run
2.35 KB
2026-03-11 16:18:52
R W Run
1.12 KB
2026-03-11 16:18:52
R W Run
4.31 KB
2026-03-11 16:18:52
R W Run
5.61 KB
2026-03-11 16:18:51
R W Run
4.09 KB
2026-03-11 16:18:52
R W Run
213.43 KB
2026-03-11 16:18:51
R W Run
1.71 KB
2026-03-11 16:18:51
R W Run
5.93 KB
2026-03-11 16:18:51
R W Run
4.54 KB
2026-03-11 16:18:52
R W Run
2.08 KB
2026-03-11 16:18:52
R W Run
2.4 KB
2026-03-11 16:18:52
R W Run
1.82 KB
2026-03-11 16:18:52
R W Run
1.67 KB
2026-03-11 16:18:52
R W Run
2.03 KB
2026-03-11 16:18:51
R W Run
4.39 KB
2026-03-11 16:18:52
R W Run
1.88 KB
2026-03-11 16:18:51
R W Run
1.59 KB
2026-03-11 16:18:51
R W Run
1.75 KB
2026-03-11 16:18:51
R W Run
1.23 KB
2026-03-11 16:18:52
R W Run
2.71 KB
2026-03-11 16:18:51
R W Run
6.63 KB
2026-03-11 16:18:52
R W Run
3.1 KB
2026-03-11 16:18:52
R W Run
1.83 KB
2026-03-11 16:18:52
R W Run
3.68 KB
2026-03-11 16:18:51
R W Run
6.29 KB
2026-03-11 16:18:52
R W Run
1.27 KB
2026-03-11 16:18:52
R W Run
5.31 KB
2026-03-11 16:18:52
R W Run
13.5 KB
2026-03-11 16:18:52
R W Run
4.99 KB
2026-03-11 16:18:52
R W Run
4.91 KB
2026-03-11 16:18:52
R W Run
8.53 KB
2026-03-11 16:18:51
R W Run
3.92 KB
2026-03-11 16:18:51
R W Run
1.24 KB
2026-03-11 16:18:51
R W Run
1.63 KB
2026-03-11 16:18:51
R W Run
4.28 KB
2026-03-11 16:18:51
R W Run
13.63 KB
2026-03-11 16:18:51
R W Run
9.74 KB
2026-03-11 16:18:52
R W Run
48.39 KB
2026-03-11 16:18:52
R W Run
361 By
2026-03-11 16:18:52
R W Run
13.29 KB
2026-03-11 16:18:51
R W Run
1.75 KB
2026-03-11 16:18:52
R W Run
1.49 KB
2026-03-11 16:18:51
R W Run
1.91 KB
2026-03-11 16:18:52
R W Run
2.67 KB
2026-03-11 16:18:51
R W Run
1.25 KB
2026-03-11 16:18:52
R W Run
2.74 KB
2026-03-11 16:18:52
R W Run
2.18 KB
2026-03-11 16:18:52
R W Run
2.29 KB
2026-03-11 16:18:52
R W Run
3.55 KB
2026-03-11 16:18:51
R W Run
3.53 KB
2026-03-11 16:18:51
R W Run
9.14 KB
2026-03-11 16:18:52
R W Run
4.72 KB
2026-03-11 16:18:51
R W Run
5.61 KB
2026-03-11 16:18:52
R W Run
3.55 KB
2026-03-11 16:18:51
R W Run
6.34 KB
2026-03-11 16:18:52
R W Run
2.09 KB
2026-03-11 16:18:51
R W Run
1.8 KB
2026-03-11 16:18:52
R W Run
3.69 KB
2026-03-11 16:18:52
R W Run
4.66 KB
2026-03-11 16:18:52
R W Run
3.49 KB
2026-03-11 16:18:52
R W Run
1.15 KB
2026-03-11 16:18:51
R W Run
2.87 KB
2026-03-11 16:18:51
R W Run
2.48 KB
2026-03-11 16:18:52
R W Run
5.56 KB
2026-03-11 16:18:51
R W Run
1.79 KB
2026-03-11 16:18:52
R W Run
4.59 KB
2026-03-11 16:18:51
R W Run
558 By
2026-03-11 16:18:52
R W Run
4.5 KB
2026-03-11 16:18:52
R W Run
23.26 KB
2026-03-11 16:18:52
R W Run
735 By
2026-03-11 16:18:52
R W Run
6.19 KB
2026-03-11 16:18:51
R W Run
1.17 KB
2026-03-11 16:18:51
R W Run
1.82 KB
2026-03-11 16:18:52
R W Run
66.15 KB
2026-03-11 16:18:52
R W Run
1.55 KB
2026-03-11 16:18:51
R W Run
9.92 KB
2026-03-11 16:18:52
R W Run
1.8 KB
2026-03-11 16:18:52
R W Run
1.73 KB
2026-03-11 16:18:52
R W Run
2.02 KB
2026-03-11 16:18:52
R W Run
4.41 KB
2026-03-11 16:18:52
R W Run
2.67 KB
2026-03-11 16:18:51
R W Run
2.38 KB
2026-03-11 16:18:52
R W Run
error_log
📄navigation-submenu.php
1<?php
2/**
3 * Server-side rendering of the `core/navigation-submenu` block.
4 *
5 * @package WordPress
6 */
7
8/**
9 * Build an array with CSS classes and inline styles defining the font sizes
10 * which will be applied to the navigation markup in the front-end.
11 *
12 * @since 5.9.0
13 *
14 * @param array $context Navigation block context.
15 * @return array Font size CSS classes and inline styles.
16 */
17function block_core_navigation_submenu_build_css_font_sizes( $context ) {
18 // CSS classes.
19 $font_sizes = array(
20 'css_classes' => array(),
21 'inline_styles' => '',
22 );
23
24 $has_named_font_size = array_key_exists( 'fontSize', $context );
25 $has_custom_font_size = isset( $context['style']['typography']['fontSize'] );
26
27 if ( $has_named_font_size ) {
28 // Add the font size class.
29 $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
30 } elseif ( $has_custom_font_size ) {
31 // Add the custom font size inline style.
32 $font_sizes['inline_styles'] = sprintf(
33 'font-size: %s;',
34 wp_get_typography_font_size_value(
35 array(
36 'size' => $context['style']['typography']['fontSize'],
37 )
38 )
39 );
40 }
41
42 return $font_sizes;
43}
44
45/**
46 * Returns the top-level submenu SVG chevron icon.
47 *
48 * @since 5.9.0
49 *
50 * @return string
51 */
52function block_core_navigation_submenu_render_submenu_icon() {
53 return '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
54}
55
56/**
57 * Renders the `core/navigation-submenu` block.
58 *
59 * @since 5.9.0
60 *
61 * @param array $attributes The block attributes.
62 * @param string $content The saved content.
63 * @param WP_Block $block The parsed block.
64 *
65 * @return string Returns the post content with the legacy widget added.
66 */
67function render_block_core_navigation_submenu( $attributes, $content, $block ) {
68 $navigation_link_has_id = isset( $attributes['id'] ) && is_numeric( $attributes['id'] );
69 $is_post_type = isset( $attributes['kind'] ) && 'post-type' === $attributes['kind'];
70 $is_post_type = $is_post_type || isset( $attributes['type'] ) && ( 'post' === $attributes['type'] || 'page' === $attributes['type'] );
71
72 // Don't render the block's subtree if it is a draft.
73 if ( $is_post_type && $navigation_link_has_id && 'publish' !== get_post_status( $attributes['id'] ) ) {
74 return '';
75 }
76
77 // Don't render the block's subtree if it has no label.
78 if ( empty( $attributes['label'] ) ) {
79 return '';
80 }
81
82 $font_sizes = block_core_navigation_submenu_build_css_font_sizes( $block->context );
83 $style_attribute = $font_sizes['inline_styles'];
84
85 $has_submenu = count( $block->inner_blocks ) > 0;
86 $kind = empty( $attributes['kind'] ) ? 'post_type' : str_replace( '-', '_', $attributes['kind'] );
87 $is_active = ! empty( $attributes['id'] ) && get_queried_object_id() === (int) $attributes['id'] && ! empty( get_queried_object()->$kind );
88
89 if ( is_post_type_archive() && ! empty( $attributes['url'] ) ) {
90 $queried_archive_link = get_post_type_archive_link( get_queried_object()->name );
91 if ( $attributes['url'] === $queried_archive_link ) {
92 $is_active = true;
93 }
94 }
95
96 $show_submenu_indicators = isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon'];
97 $open_on_click = isset( $block->context['openSubmenusOnClick'] ) && $block->context['openSubmenusOnClick'];
98 $open_on_hover_and_click = isset( $block->context['openSubmenusOnClick'] ) && ! $block->context['openSubmenusOnClick'] &&
99 $show_submenu_indicators;
100
101 $classes = array(
102 'wp-block-navigation-item',
103 );
104 $classes = array_merge(
105 $classes,
106 $font_sizes['css_classes']
107 );
108 if ( $has_submenu ) {
109 $classes[] = 'has-child';
110 }
111 if ( $open_on_click ) {
112 $classes[] = 'open-on-click';
113 }
114 if ( $open_on_hover_and_click ) {
115 $classes[] = 'open-on-hover-click';
116 }
117 if ( $is_active ) {
118 $classes[] = 'current-menu-item';
119 }
120
121 $wrapper_attributes = get_block_wrapper_attributes(
122 array(
123 'class' => implode( ' ', $classes ),
124 'style' => $style_attribute,
125 )
126 );
127
128 $label = '';
129
130 if ( isset( $attributes['label'] ) ) {
131 $label .= wp_kses_post( $attributes['label'] );
132 }
133
134 $aria_label = sprintf(
135 /* translators: Accessibility text. %s: Parent page title. */
136 __( '%s submenu' ),
137 wp_strip_all_tags( $label )
138 );
139
140 $html = '<li ' . $wrapper_attributes . '>';
141
142 // If Submenus open on hover, we render an anchor tag with attributes.
143 // If submenu icons are set to show, we also render a submenu button, so the submenu can be opened on click.
144 if ( ! $open_on_click ) {
145 $item_url = isset( $attributes['url'] ) ? $attributes['url'] : '';
146 // Start appending HTML attributes to anchor tag.
147 $html .= '<a class="wp-block-navigation-item__content"';
148
149 // The href attribute on a and area elements is not required;
150 // when those elements do not have href attributes they do not create hyperlinks.
151 // But also The href attribute must have a value that is a valid URL potentially
152 // surrounded by spaces.
153 // see: https://html.spec.whatwg.org/multipage/links.html#links-created-by-a-and-area-elements.
154 if ( ! empty( $item_url ) ) {
155 $html .= ' href="' . esc_url( $item_url ) . '"';
156 }
157
158 if ( $is_active ) {
159 $html .= ' aria-current="page"';
160 }
161
162 if ( isset( $attributes['opensInNewTab'] ) && true === $attributes['opensInNewTab'] ) {
163 $html .= ' target="_blank" ';
164 }
165
166 if ( isset( $attributes['rel'] ) ) {
167 $html .= ' rel="' . esc_attr( $attributes['rel'] ) . '"';
168 } elseif ( isset( $attributes['nofollow'] ) && $attributes['nofollow'] ) {
169 $html .= ' rel="nofollow"';
170 }
171
172 if ( isset( $attributes['title'] ) ) {
173 $html .= ' title="' . esc_attr( $attributes['title'] ) . '"';
174 }
175
176 $html .= '>';
177 // End appending HTML attributes to anchor tag.
178
179 $html .= '<span class="wp-block-navigation-item__label">';
180 $html .= $label;
181 $html .= '</span>';
182
183 // Add description if available.
184 if ( ! empty( $attributes['description'] ) ) {
185 $html .= '<span class="wp-block-navigation-item__description">';
186 $html .= wp_kses_post( $attributes['description'] );
187 $html .= '</span>';
188 }
189
190 $html .= '</a>';
191 // End anchor tag content.
192
193 if ( $show_submenu_indicators ) {
194 // The submenu icon is rendered in a button here
195 // so that there's a clickable element to open the submenu.
196 $html .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">' . block_core_navigation_submenu_render_submenu_icon() . '</button>';
197 }
198 } else {
199 // If menus open on click, we render the parent as a button.
200 $html .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="wp-block-navigation-item__content wp-block-navigation-submenu__toggle" aria-expanded="false">';
201
202 // Wrap title with span to isolate it from submenu icon.
203 $html .= '<span class="wp-block-navigation-item__label">';
204
205 $html .= $label;
206
207 $html .= '</span>';
208
209 // Add description if available.
210 if ( ! empty( $attributes['description'] ) ) {
211 $html .= '<span class="wp-block-navigation-item__description">';
212 $html .= wp_kses_post( $attributes['description'] );
213 $html .= '</span>';
214 }
215
216 $html .= '</button>';
217
218 $html .= '<span class="wp-block-navigation__submenu-icon">' . block_core_navigation_submenu_render_submenu_icon() . '</span>';
219
220 }
221
222 if ( $has_submenu ) {
223 // Copy some attributes from the parent block to this one.
224 // Ideally this would happen in the client when the block is created.
225 if ( array_key_exists( 'overlayTextColor', $block->context ) ) {
226 $attributes['textColor'] = $block->context['overlayTextColor'];
227 }
228 if ( array_key_exists( 'overlayBackgroundColor', $block->context ) ) {
229 $attributes['backgroundColor'] = $block->context['overlayBackgroundColor'];
230 }
231 if ( array_key_exists( 'customOverlayTextColor', $block->context ) ) {
232 $attributes['style']['color']['text'] = $block->context['customOverlayTextColor'];
233 }
234 if ( array_key_exists( 'customOverlayBackgroundColor', $block->context ) ) {
235 $attributes['style']['color']['background'] = $block->context['customOverlayBackgroundColor'];
236 }
237
238 // This allows us to be able to get a response from wp_apply_colors_support.
239 $block->block_type->supports['color'] = true;
240 $colors_supports = wp_apply_colors_support( $block->block_type, $attributes );
241 $css_classes = 'wp-block-navigation__submenu-container';
242 if ( array_key_exists( 'class', $colors_supports ) ) {
243 $css_classes .= ' ' . $colors_supports['class'];
244 }
245
246 $style_attribute = '';
247 if ( array_key_exists( 'style', $colors_supports ) ) {
248 $style_attribute = $colors_supports['style'];
249 }
250
251 $inner_blocks_html = '';
252 foreach ( $block->inner_blocks as $inner_block ) {
253 $inner_blocks_html .= $inner_block->render();
254 }
255
256 if ( strpos( $inner_blocks_html, 'current-menu-item' ) ) {
257 $tag_processor = new WP_HTML_Tag_Processor( $html );
258 while ( $tag_processor->next_tag( array( 'class_name' => 'wp-block-navigation-item' ) ) ) {
259 $tag_processor->add_class( 'current-menu-ancestor' );
260 }
261 $html = $tag_processor->get_updated_html();
262 }
263
264 $wrapper_attributes = get_block_wrapper_attributes(
265 array(
266 'class' => $css_classes,
267 'style' => $style_attribute,
268 )
269 );
270
271 $html .= sprintf(
272 '<ul %s>%s</ul>',
273 $wrapper_attributes,
274 $inner_blocks_html
275 );
276
277 }
278
279 $html .= '</li>';
280
281 return $html;
282}
283
284/**
285 * Register the navigation submenu block.
286 *
287 * @since 5.9.0
288 *
289 * @uses render_block_core_navigation_submenu()
290 * @throws WP_Error An WP_Error exception parsing the block definition.
291 */
292function register_block_core_navigation_submenu() {
293 register_block_type_from_metadata(
294 __DIR__ . '/navigation-submenu',
295 array(
296 'render_callback' => 'render_block_core_navigation_submenu',
297 )
298 );
299}
300add_action( 'init', 'register_block_core_navigation_submenu' );
301