You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress导航栏设置求助:如何将get_pages返回的扁平数组转为嵌套对象

自定义WordPress嵌套页面导航实现方案

WordPress原生没有直接返回嵌套页面对象的内置函数,你可以自行实现转换逻辑将get_pages()返回的扁平数组转为层级嵌套结构,实现代码如下:

1. 扁平数组转嵌套结构函数

function get_nested_pages() {
    // 获取所有公开页面,按后台设置的菜单顺序排序
    $flat_pages = get_pages([
        'sort_column' => 'menu_order',
        'sort_order' => 'ASC',
        'post_status' => 'publish'
    ]);

    // 初始化ID索引表,为每个页面预加空children字段
    $pages_index = [];
    foreach ($flat_pages as $page) {
        $page->children = [];
        $pages_index[$page->ID] = $page;
    }

    // 组装嵌套结构
    $nested_pages = [];
    foreach ($flat_pages as $page) {
        // post_parent为0是顶级页面
        if ($page->post_parent === 0) {
            $nested_pages[] = $page;
        } 
        // 子页面挂载到对应父页面的children属性下
        else if (isset($pages_index[$page->post_parent])) {
            $pages_index[$page->post_parent]->children[] = $page;
        }
    }

    return $nested_pages;
}

2. 递归渲染自定义导航栏

拿到嵌套结构后,可以用递归函数自由渲染导航样式,示例如下:

function render_custom_nav($pages) {
    if (empty($pages)) return;
    
    echo '<ul class="nav-list">';
    foreach ($pages as $page) {
        // 可自行加当前页面高亮、自定义类名等逻辑
        $active_class = is_page($page->ID) ? 'active' : '';
        echo sprintf(
            '<li class="nav-item %s">
                <a href="%s">%s</a>',
            $active_class,
            get_permalink($page->ID),
            esc_html($page->post_title)
        );
        // 递归渲染子菜单
        if (!empty($page->children)) {
            render_custom_nav($page->children);
        }
        echo '</li>';
    }
    echo '</ul>';
}

// 调用示例:放在主题需要显示导航的位置即可
$nested_pages = get_nested_pages();
render_custom_nav($nested_pages);

额外说明

  • 如果需要排除指定页面,可在get_pages的参数中添加exclude参数,传入要排除的页面ID数组即可,例如:'exclude' => [2,5]
  • 排序规则可自行修改get_pages的sort_column参数,支持按日期、标题、ID等字段排序

内容的提问来源于stack exchange,提问作者Amir Rahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:48:04