block_core_page_list_render_nested_page_list

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

WordPress Version: 6.3

/**
 * Outputs Page list markup from an array of pages with nested children.
 *
 * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover.
 * @param boolean $show_submenu_icons Whether to show submenu indicator icons.
 * @param boolean $is_navigation_child If block is a child of Navigation block.
 * @param array   $nested_pages The array of nested pages.
 * @param boolean $is_nested Whether the submenu is nested or not.
 * @param array   $active_page_ancestor_ids An array of ancestor ids for active page.
 * @param array   $colors Color information for overlay styles.
 * @param integer $depth The nesting depth.
 *
 * @return string List markup.
 */
function block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0)
{
    if (empty($nested_pages)) {
        return;
    }
    $front_page_id = (int) get_option('page_on_front');
    $markup = '';
    foreach ((array) $nested_pages as $page) {
        $css_class = $page['is_active'] ? ' current-menu-item' : '';
        $aria_current = $page['is_active'] ? ' aria-current="page"' : '';
        $style_attribute = '';
        $css_class .= in_array($page['page_id'], $active_page_ancestor_ids, true) ? ' current-menu-ancestor' : '';
        if (isset($page['children'])) {
            $css_class .= ' has-child';
        }
        if ($is_navigation_child) {
            $css_class .= ' wp-block-navigation-item';
            if ($open_submenus_on_click) {
                $css_class .= ' open-on-click';
            } elseif ($show_submenu_icons) {
                $css_class .= ' open-on-hover-click';
            }
        }
        $navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : '';
        // If this is the first level of submenus, include the overlay colors.
        if ((0 < $depth && !$is_nested || $is_nested) && isset($colors['overlay_css_classes'], $colors['overlay_inline_styles'])) {
            $css_class .= ' ' . trim(implode(' ', $colors['overlay_css_classes']));
            if ('' !== $colors['overlay_inline_styles']) {
                $style_attribute = sprintf(' style="%s"', esc_attr($colors['overlay_inline_styles']));
            }
        }
        if ((int) $page['page_id'] === $front_page_id) {
            $css_class .= ' menu-item-home';
        }
        $title = wp_kses_post($page['title']);
        $aria_label = sprintf(
            /* translators: Accessibility text. %s: Parent page title. */
            __('%s submenu'),
            wp_strip_all_tags($title)
        );
        $markup .= '<li class="wp-block-pages-list__item' . esc_attr($css_class) . '"' . $style_attribute . '>';
        if (isset($page['children']) && $is_navigation_child && $open_submenus_on_click) {
            $markup .= '<button aria-label="' . esc_attr($aria_label) . '" class="' . esc_attr($navigation_child_content_class) . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . esc_html($title) . '</button><span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><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></span>';
        } else {
            $markup .= '<a class="wp-block-pages-list__item__link' . esc_attr($navigation_child_content_class) . '" href="' . esc_url($page['link']) . '"' . $aria_current . '>' . $title . '</a>';
        }
        if (isset($page['children'])) {
            if ($is_navigation_child && $show_submenu_icons && !$open_submenus_on_click) {
                $markup .= '<button aria-label="' . esc_attr($aria_label) . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">';
                $markup .= '<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>';
                $markup .= '</button>';
            }
            $markup .= '<ul class="wp-block-navigation__submenu-container">';
            $markup .= block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $is_nested, $active_page_ancestor_ids, $colors, $depth + 1);
            $markup .= '</ul>';
        }
        $markup .= '</li>';
    }
    return $markup;
}

WordPress Version: 6.2

/**
 * Outputs Page list markup from an array of pages with nested children.
 *
 * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover.
 * @param boolean $show_submenu_icons Whether to show submenu indicator icons.
 * @param boolean $is_navigation_child If block is a child of Navigation block.
 * @param array   $nested_pages The array of nested pages.
 * @param boolean $is_nested Whether the submenu is nested or not.
 * @param array   $active_page_ancestor_ids An array of ancestor ids for active page.
 * @param array   $colors Color information for overlay styles.
 * @param integer $depth The nesting depth.
 *
 * @return string List markup.
 */
function block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0)
{
    if (empty($nested_pages)) {
        return;
    }
    $markup = '';
    foreach ((array) $nested_pages as $page) {
        $css_class = $page['is_active'] ? ' current-menu-item' : '';
        $aria_current = $page['is_active'] ? ' aria-current="page"' : '';
        $style_attribute = '';
        $css_class .= in_array($page['page_id'], $active_page_ancestor_ids, true) ? ' current-menu-ancestor' : '';
        if (isset($page['children'])) {
            $css_class .= ' has-child';
        }
        if ($is_navigation_child) {
            $css_class .= ' wp-block-navigation-item';
            if ($open_submenus_on_click) {
                $css_class .= ' open-on-click';
            } elseif ($show_submenu_icons) {
                $css_class .= ' open-on-hover-click';
            }
        }
        $navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : '';
        // If this is the first level of submenus, include the overlay colors.
        if ((0 < $depth && !$is_nested || $is_nested) && isset($colors['overlay_css_classes'], $colors['overlay_inline_styles'])) {
            $css_class .= ' ' . trim(implode(' ', $colors['overlay_css_classes']));
            if ('' !== $colors['overlay_inline_styles']) {
                $style_attribute = sprintf(' style="%s"', esc_attr($colors['overlay_inline_styles']));
            }
        }
        $front_page_id = (int) get_option('page_on_front');
        if ((int) $page['page_id'] === $front_page_id) {
            $css_class .= ' menu-item-home';
        }
        $title = wp_kses_post($page['title']);
        $aria_label = sprintf(
            /* translators: Accessibility text. %s: Parent page title. */
            __('%s submenu'),
            wp_strip_all_tags($title)
        );
        $markup .= '<li class="wp-block-pages-list__item' . esc_attr($css_class) . '"' . $style_attribute . '>';
        if (isset($page['children']) && $is_navigation_child && $open_submenus_on_click) {
            $markup .= '<button aria-label="' . esc_attr($aria_label) . '" class="' . esc_attr($navigation_child_content_class) . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . esc_html($title) . '</button><span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><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></span>';
        } else {
            $markup .= '<a class="wp-block-pages-list__item__link' . esc_attr($navigation_child_content_class) . '" href="' . esc_url($page['link']) . '"' . $aria_current . '>' . $title . '</a>';
        }
        if (isset($page['children'])) {
            if ($is_navigation_child && $show_submenu_icons && !$open_submenus_on_click) {
                $markup .= '<button aria-label="' . esc_attr($aria_label) . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">';
                $markup .= '<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>';
                $markup .= '</button>';
            }
            $markup .= '<ul class="wp-block-navigation__submenu-container">';
            $markup .= block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $is_nested, $active_page_ancestor_ids, $colors, $depth + 1);
            $markup .= '</ul>';
        }
        $markup .= '</li>';
    }
    return $markup;
}

WordPress Version: 6.1

/**
 * Outputs Page list markup from an array of pages with nested children.
 *
 * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover.
 * @param boolean $show_submenu_icons Whether to show submenu indicator icons.
 * @param boolean $is_navigation_child If block is a child of Navigation block.
 * @param array   $nested_pages The array of nested pages.
 * @param array   $active_page_ancestor_ids An array of ancestor ids for active page.
 * @param array   $colors Color information for overlay styles.
 * @param integer $depth The nesting depth.
 *
 * @return string List markup.
 */
function block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0)
{
    if (empty($nested_pages)) {
        return;
    }
    $markup = '';
    foreach ((array) $nested_pages as $page) {
        $css_class = $page['is_active'] ? ' current-menu-item' : '';
        $aria_current = $page['is_active'] ? ' aria-current="page"' : '';
        $style_attribute = '';
        $css_class .= in_array($page['page_id'], $active_page_ancestor_ids, true) ? ' current-menu-ancestor' : '';
        if (isset($page['children'])) {
            $css_class .= ' has-child';
        }
        if ($is_navigation_child) {
            $css_class .= ' wp-block-navigation-item';
            if ($open_submenus_on_click) {
                $css_class .= ' open-on-click';
            } elseif ($show_submenu_icons) {
                $css_class .= ' open-on-hover-click';
            }
        }
        $navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : '';
        // If this is the first level of submenus, include the overlay colors.
        if (1 === $depth && isset($colors['overlay_css_classes'], $colors['overlay_inline_styles'])) {
            $css_class .= ' ' . trim(implode(' ', $colors['overlay_css_classes']));
            if ('' !== $colors['overlay_inline_styles']) {
                $style_attribute = sprintf(' style="%s"', esc_attr($colors['overlay_inline_styles']));
            }
        }
        $front_page_id = (int) get_option('page_on_front');
        if ((int) $page['page_id'] === $front_page_id) {
            $css_class .= ' menu-item-home';
        }
        $title = wp_kses_post($page['title']);
        $aria_label = sprintf(
            /* translators: Accessibility text. %s: Parent page title. */
            __('%s submenu'),
            wp_strip_all_tags($title)
        );
        $markup .= '<li class="wp-block-pages-list__item' . esc_attr($css_class) . '"' . $style_attribute . '>';
        if (isset($page['children']) && $is_navigation_child && $open_submenus_on_click) {
            $markup .= '<button aria-label="' . esc_attr($aria_label) . '" class="' . esc_attr($navigation_child_content_class) . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . esc_html($title) . '</button>' . '<span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><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></span>';
        } else {
            $markup .= '<a class="wp-block-pages-list__item__link' . esc_attr($navigation_child_content_class) . '" href="' . esc_url($page['link']) . '"' . $aria_current . '>' . $title . '</a>';
        }
        if (isset($page['children'])) {
            if ($is_navigation_child && $show_submenu_icons && !$open_submenus_on_click) {
                $markup .= '<button aria-label="' . esc_attr($aria_label) . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">';
                $markup .= '<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>';
                $markup .= '</button>';
            }
            $markup .= '<ul class="submenu-container';
            // Extra classname is added when the block is a child of Navigation.
            if ($is_navigation_child) {
                $markup .= ' wp-block-navigation__submenu-container';
            }
            $markup .= '">' . block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $active_page_ancestor_ids, $colors, $depth + 1) . '</ul>';
        }
        $markup .= '</li>';
    }
    return $markup;
}

WordPress Version: 9.1

/**
 * Outputs Page list markup from an array of pages with nested children.
 *
 * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover.
 * @param boolean $show_submenu_icons Whether to show submenu indicator icons.
 * @param boolean $is_navigation_child If block is a child of Navigation block.
 * @param array   $nested_pages The array of nested pages.
 * @param array   $active_page_ancestor_ids An array of ancestor ids for active page.
 * @param array   $colors Color information for overlay styles.
 * @param integer $depth The nesting depth.
 *
 * @return string List markup.
 */
function block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0)
{
    if (empty($nested_pages)) {
        return;
    }
    $markup = '';
    foreach ((array) $nested_pages as $page) {
        $css_class = $page['is_active'] ? ' current-menu-item' : '';
        $aria_current = $page['is_active'] ? ' aria-current="page"' : '';
        $style_attribute = '';
        $css_class .= in_array($page['page_id'], $active_page_ancestor_ids, true) ? ' current-menu-ancestor' : '';
        if (isset($page['children'])) {
            $css_class .= ' has-child';
        }
        if ($is_navigation_child) {
            $css_class .= ' wp-block-navigation-item';
            if ($open_submenus_on_click) {
                $css_class .= ' open-on-click';
            } elseif ($show_submenu_icons) {
                $css_class .= ' open-on-hover-click';
            }
        }
        $navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : '';
        // If this is the first level of submenus, include the overlay colors.
        if (1 === $depth && isset($colors['overlay_css_classes'], $colors['overlay_inline_styles'])) {
            $css_class .= ' ' . trim(implode(' ', $colors['overlay_css_classes']));
            if ('' !== $colors['overlay_inline_styles']) {
                $style_attribute = sprintf(' style="%s"', esc_attr($colors['overlay_inline_styles']));
            }
        }
        $front_page_id = (int) get_option('page_on_front');
        if ((int) $page['page_id'] === $front_page_id) {
            $css_class .= ' menu-item-home';
        }
        $title = wp_kses($page['title'], wp_kses_allowed_html('post'));
        $aria_label = sprintf(
            /* translators: Accessibility text. %s: Parent page title. */
            __('%s submenu'),
            wp_strip_all_tags($title)
        );
        $markup .= '<li class="wp-block-pages-list__item' . $css_class . '"' . $style_attribute . '>';
        if (isset($page['children']) && $is_navigation_child && $open_submenus_on_click) {
            $markup .= '<button aria-label="' . $aria_label . '" class="' . $navigation_child_content_class . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . $title . '<span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>' . '</button>';
        } else {
            $markup .= '<a class="wp-block-pages-list__item__link' . $navigation_child_content_class . '" href="' . esc_url($page['link']) . '"' . $aria_current . '>' . $title . '</a>';
        }
        if (isset($page['children'])) {
            if ($is_navigation_child && $show_submenu_icons && !$open_submenus_on_click) {
                $markup .= '<button aria-label="' . $aria_label . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">';
                $markup .= '<span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>';
                $markup .= '</button>';
            }
            $markup .= '<ul class="submenu-container';
            // Extra classname is added when the block is a child of Navigation.
            if ($is_navigation_child) {
                $markup .= ' wp-block-navigation__submenu-container';
            }
            $markup .= '">' . block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $active_page_ancestor_ids, $colors, $depth + 1) . '</ul>';
        }
        $markup .= '</li>';
    }
    return $markup;
}

WordPress Version: 5.9

/**
 * Outputs Page list markup from an array of pages with nested children.
 *
 * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover.
 * @param boolean $show_submenu_icons Whether to show submenu indicator icons.
 * @param boolean $is_navigation_child If block is a child of Navigation block.
 * @param array   $nested_pages The array of nested pages.
 * @param array   $active_page_ancestor_ids An array of ancestor ids for active page.
 * @param array   $colors Color information for overlay styles.
 * @param integer $depth The nesting depth.
 *
 * @return string List markup.
 */
function block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0)
{
    if (empty($nested_pages)) {
        return;
    }
    $markup = '';
    foreach ((array) $nested_pages as $page) {
        $css_class = $page['is_active'] ? ' current-menu-item' : '';
        $aria_current = $page['is_active'] ? ' aria-current="page"' : '';
        $style_attribute = '';
        $css_class .= in_array($page['page_id'], $active_page_ancestor_ids, true) ? ' current-menu-ancestor' : '';
        if (isset($page['children'])) {
            $css_class .= ' has-child';
        }
        if ($is_navigation_child) {
            $css_class .= ' wp-block-navigation-item';
            if ($open_submenus_on_click) {
                $css_class .= ' open-on-click';
            } elseif ($show_submenu_icons) {
                $css_class .= ' open-on-hover-click';
            }
        }
        $navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : '';
        // If this is the first level of submenus, include the overlay colors.
        if (1 === $depth && isset($colors['overlay_css_classes'], $colors['overlay_inline_styles'])) {
            $css_class .= ' ' . trim(implode(' ', $colors['overlay_css_classes']));
            if ('' !== $colors['overlay_inline_styles']) {
                $style_attribute = sprintf(' style="%s"', esc_attr($colors['overlay_inline_styles']));
            }
        }
        $title = wp_kses($page['title'], wp_kses_allowed_html('post'));
        $aria_label = sprintf(
            /* translators: Accessibility text. %s: Parent page title. */
            __('%s submenu'),
            wp_strip_all_tags($title)
        );
        $markup .= '<li class="wp-block-pages-list__item' . $css_class . '"' . $style_attribute . '>';
        if (isset($page['children']) && $is_navigation_child && $open_submenus_on_click) {
            $markup .= '<button aria-label="' . $aria_label . '" class="' . $navigation_child_content_class . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . $title . '<span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>' . '</button>';
        } else {
            $markup .= '<a class="wp-block-pages-list__item__link' . $navigation_child_content_class . '" href="' . esc_url($page['link']) . '"' . $aria_current . '>' . $title . '</a>';
        }
        if (isset($page['children'])) {
            if ($is_navigation_child && $show_submenu_icons && !$open_submenus_on_click) {
                $markup .= '<button aria-label="' . $aria_label . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">';
                $markup .= '<span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>';
                $markup .= '</button>';
            }
            $markup .= '<ul class="submenu-container';
            // Extra classname is added when the block is a child of Navigation.
            if ($is_navigation_child) {
                $markup .= ' wp-block-navigation__submenu-container';
            }
            $markup .= '">' . block_core_page_list_render_nested_page_list($open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $active_page_ancestor_ids, $colors, $depth + 1) . '</ul>';
        }
        $markup .= '</li>';
    }
    return $markup;
}

WordPress Version: 5.8

/**
 * Outputs Page list markup from an array of pages with nested children.
 *
 * @param array $nested_pages The array of nested pages.
 *
 * @return string List markup.
 */
function block_core_page_list_render_nested_page_list($nested_pages)
{
    if (empty($nested_pages)) {
        return;
    }
    $markup = '';
    foreach ((array) $nested_pages as $page) {
        $css_class = 'wp-block-pages-list__item';
        if (isset($page['children'])) {
            $css_class .= ' has-child';
        }
        $markup .= '<li class="' . $css_class . '">';
        $markup .= '<a class="wp-block-pages-list__item__link" href="' . esc_url($page['link']) . '">' . wp_kses($page['title'], wp_kses_allowed_html('post')) . '</a>';
        if (isset($page['children'])) {
            $markup .= '<span class="wp-block-page-list__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>';
            $markup .= '<ul class="submenu-container">' . block_core_page_list_render_nested_page_list($page['children']) . '</ul>';
        }
        $markup .= '</li>';
    }
    return $markup;
}