WordPress中如何用wp_list_pages()仅显示当前父层级目录
WordPress动态层级目录实现方案
核心思路
- 普通页面:自动识别当前页面的最顶级父页面,输出该父页面及其所有子页面
- 自定义文章类型(CPT)单页:通过URL解析匹配对应的页面层级,找到关联的顶级页面后输出其下属目录
完整可运行代码
<?php // 初始化顶级页面ID $top_level_page_id = 0; // 处理自定义文章类型单页(替换customPostTypeName为你的CPT注册名称) if (is_singular('customPostTypeName')) { // 获取当前URL并解析父级slug $current_url = esc_url_raw($_SERVER['REQUEST_URI']); // 匹配URL中的routes-and-maps路径(根据你的重写规则调整) if (strpos($current_url, '/routes-and-maps/') !== false) { // 通过slug获取对应页面ID $target_page = get_page_by_path('routes-and-maps'); if ($target_page) { $top_level_page_id = $target_page->ID; } } } else { // 处理普通页面 global $post; // 获取当前页面的所有祖先ID(从近到远排序) $ancestors = get_post_ancestors($post->ID); // 确定顶级页面:有祖先则取最顶级,无则用当前页面 $top_level_page_id = !empty($ancestors) ? end($ancestors) : $post->ID; } // 输出层级目录 if ($top_level_page_id) { ?> <nav id="navStandard" class="sidebar-nav well"> <ul> <?php wp_list_pages(array( 'depth' => 2, 'child_of' => $top_level_page_id, 'title_li' => '', 'exclude' => '32891,32893' // 保留你需要排除的页面ID )); ?> </ul> </nav> <?php } ?>
关键修复说明
解决数组转字符串错误:
原代码固定取$grandparent[1],当页面只有一级父级时会导致数组越界,现在通过end($ancestors)动态获取最顶级父页面ID,确保参数始终有效。CPT页面关联层级问题:
原代码依赖post_parent字段,但CPT的post_parent通常不关联页面层级。现在通过URL中的slug匹配,直接找到对应的页面ID,完美适配你重写后的URL结构。简化逻辑:
合并两次wp_list_pages调用为一次,用child_of参数直接输出顶级页面及其子页面,避免原代码中参数切换导致的混乱。
内容的提问来源于stack exchange,提问作者Lars Martinson
相关产品推荐
相关产品推荐

