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
相关产品推荐
相关产品推荐

