WordPress Version: 5.9
/**
* Renders the `core/navigation-link` block.
*
* @param array $attributes The block attributes.
* @param array $content The saved content.
* @param array $block The parsed block.
*
* @return string Returns the post content with the legacy widget added.
*/
function render_block_core_navigation_link($attributes, $content, $block)
{
$navigation_link_has_id = isset($attributes['id']) && is_numeric($attributes['id']);
$is_post_type = isset($attributes['kind']) && 'post-type' === $attributes['kind'];
$is_post_type = $is_post_type || isset($attributes['type']) && ('post' === $attributes['type'] || 'page' === $attributes['type']);
// Don't render the block's subtree if it is a draft or if the ID does not exist.
if ($is_post_type && $navigation_link_has_id) {
$post = get_post($attributes['id']);
if (!$post || 'publish' !== $post->post_status) {
return '';
}
}
// Don't render the block's subtree if it has no label.
if (empty($attributes['label'])) {
return '';
}
$colors = block_core_navigation_link_build_css_colors($block->context, $attributes);
$font_sizes = block_core_navigation_link_build_css_font_sizes($block->context);
$classes = array_merge($colors['css_classes'], $font_sizes['css_classes']);
$style_attribute = $colors['inline_styles'] . $font_sizes['inline_styles'];
$css_classes = trim(implode(' ', $classes));
$has_submenu = count($block->inner_blocks) > 0;
$is_active = !empty($attributes['id']) && get_the_ID() === $attributes['id'];
$wrapper_attributes = get_block_wrapper_attributes(array('class' => $css_classes . ' wp-block-navigation-item' . ($has_submenu ? ' has-child' : '') . ($is_active ? ' current-menu-item' : ''), 'style' => $style_attribute));
$html = '<li ' . $wrapper_attributes . '>' . '<a class="wp-block-navigation-item__content" ';
// Start appending HTML attributes to anchor tag.
if (isset($attributes['url'])) {
$html .= ' href="' . esc_url($attributes['url']) . '"';
}
if ($is_active) {
$html .= ' aria-current="page"';
}
if (isset($attributes['opensInNewTab']) && true === $attributes['opensInNewTab']) {
$html .= ' target="_blank" ';
}
if (isset($attributes['rel'])) {
$html .= ' rel="' . esc_attr($attributes['rel']) . '"';
} elseif (isset($attributes['nofollow']) && $attributes['nofollow']) {
$html .= ' rel="nofollow"';
}
if (isset($attributes['title'])) {
$html .= ' title="' . esc_attr($attributes['title']) . '"';
}
// End appending HTML attributes to anchor tag.
// Start anchor tag content.
$html .= '>' . '<span class="wp-block-navigation-item__label">';
if (isset($attributes['label'])) {
$html .= wp_kses($attributes['label'], array('code' => array(), 'em' => array(), 'img' => array('scale' => array(), 'class' => array(), 'style' => array(), 'src' => array(), 'alt' => array()), 's' => array(), 'span' => array('style' => array()), 'strong' => array()));
}
$html .= '</span>';
if (isset($block->context['showSubmenuIcon']) && $block->context['showSubmenuIcon'] && $has_submenu) {
// The submenu icon can be hidden by a CSS rule on the Navigation Block.
$html .= '<span class="wp-block-navigation__submenu-icon">' . block_core_navigation_link_render_submenu_icon() . '</span>';
}
$html .= '</a>';
// End anchor tag content.
if ($has_submenu) {
$inner_blocks_html = '';
foreach ($block->inner_blocks as $inner_block) {
$inner_blocks_html .= $inner_block->render();
}
$html .= sprintf('<ul class="wp-block-navigation__submenu-container">%s</ul>', $inner_blocks_html);
}
$html .= '</li>';
return $html;
}