render_block_core_navigation_link

The timeline below displays how wordpress function render_block_core_navigation_link has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.3

/**
 * Renders the `core/navigation-link` block.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $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 '';
    }
    $font_sizes = block_core_navigation_link_build_css_font_sizes($block->context);
    $classes = array_merge($font_sizes['css_classes']);
    $style_attribute = $font_sizes['inline_styles'];
    $css_classes = trim(implode(' ', $classes));
    $has_submenu = count($block->inner_blocks) > 0;
    $kind = empty($attributes['kind']) ? 'post_type' : str_replace('-', '_', $attributes['kind']);
    $is_active = !empty($attributes['id']) && get_queried_object_id() === (int) $attributes['id'] && !empty(get_queried_object()->{$kind});
    $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(block_core_navigation_link_maybe_urldecode($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_post($attributes['label']);
    }
    $html .= '</span>';
    // Add description if available.
    if (!empty($attributes['description'])) {
        $html .= '<span class="wp-block-navigation-item__description">';
        $html .= wp_kses_post($attributes['description']);
        $html .= '</span>';
    }
    $html .= '</a>';
    // End anchor tag content.
    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>';
    }
    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;
}

WordPress Version: 6.2

/**
 * Renders the `core/navigation-link` block.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $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 '';
    }
    $font_sizes = block_core_navigation_link_build_css_font_sizes($block->context);
    $classes = array_merge($font_sizes['css_classes']);
    $style_attribute = $font_sizes['inline_styles'];
    $css_classes = trim(implode(' ', $classes));
    $has_submenu = count($block->inner_blocks) > 0;
    $is_active = !empty($attributes['id']) && get_queried_object_id() === (int) $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(block_core_navigation_link_maybe_urldecode($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_post($attributes['label']);
    }
    $html .= '</span>';
    // Add description if available.
    if (!empty($attributes['description'])) {
        $html .= '<span class="wp-block-navigation-item__description">';
        $html .= wp_kses_post($attributes['description']);
        $html .= '</span>';
    }
    $html .= '</a>';
    // End anchor tag content.
    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>';
    }
    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;
}

WordPress Version: 6.1

/**
 * Renders the `core/navigation-link` block.
 *
 * @param array    $attributes The block attributes.
 * @param string   $content    The saved content.
 * @param WP_Block $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_queried_object_id() === (int) $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_post($attributes['label']);
    }
    $html .= '</span>';
    // Add description if available.
    if (!empty($attributes['description'])) {
        $html .= '<span class="wp-block-navigation-item__description">';
        $html .= wp_kses_post($attributes['description']);
        $html .= '</span>';
    }
    $html .= '</a>';
    // End anchor tag content.
    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>';
    }
    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;
}

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;
}