WordPress:在自定义文章类型模板中显示父级页面及同级页面
当然可以实现!
下面我就给你一步步拆解怎么在自定义文章类型(CPT)模板里完成这个需求:
核心思路
我们需要先找到当前CPT所属的Level 2父页面,再获取这个Level 2页面的所有同级页面(也就是同一个Level 1父页面下的其他Level 2页面),最后循环输出时给当前所属的Level 2页面加上current类。
具体代码实现
把这段代码放到你的自定义文章类型模板文件(比如single-{cpt-slug}.php)里合适的位置即可:
<?php // 获取当前自定义文章的ID $current_cpt_id = get_the_ID(); // 获取当前CPT的所有祖先页面(顺序:最近父级 → 顶级父级) $ancestors = get_post_ancestors( $current_cpt_id ); // 确保存在祖先页面(也就是CPT确实设置了Level 2父页面) if ( ! empty( $ancestors ) ) { // 第一个元素就是Level 2父页面的ID(因为CPT的直接父级是Level 2) $level2_parent_id = $ancestors[0]; // 获取Level 2页面的父级(也就是Level 1页面的ID) $level1_parent_id = wp_get_post_parent_id( $level2_parent_id ); // 获取所有Level 1页面下的直接子页面(也就是所有Level 2同级页面) $sibling_pages = get_pages( array( 'child_of' => $level1_parent_id, 'parent' => $level1_parent_id, // 确保只取直接子页面,避免嵌套更深的页面 'sort_column' => 'menu_order', // 按后台设置的菜单顺序排序,可改成post_date按发布时间排 'sort_order' => 'ASC', 'post_status' => 'publish' // 只取已发布的页面 ) ); // 如果有同级页面,就输出列表 if ( ! empty( $sibling_pages ) ) { echo '<ul class="level2-sibling-nav">'; foreach ( $sibling_pages as $page ) { // 给当前CPT所属的Level 2页面添加current类 $active_class = ( $page->ID === $level2_parent_id ) ? 'current' : ''; echo '<li class="' . esc_attr( $active_class ) . '">'; echo '<a href="' . esc_url( get_permalink( $page->ID ) ) . '">' . esc_html( get_the_title( $page->ID ) ) . '</a>'; echo '</li>'; } echo '</ul>'; } } ?>
关键细节说明
- 层级判断:
get_post_ancestors返回的数组是从最近的父级开始排序的,所以第一个元素就是CPT的直接父级(也就是Level 2页面),完美匹配你的页面结构。 - 同级页面筛选:通过
parent参数指定为Level 1页面ID,确保只获取Level 2层级的页面,不会把更深的子页面也拉进来。 - 安全处理:用
esc_attr、esc_url、esc_html对输出内容进行转义,避免XSS安全问题,这是WordPress开发的标准最佳实践。 - 兼容性前提:要确保你的自定义文章类型在注册时设置了
'hierarchical' => true,并且支持父页面选择(默认开启层级的话,后台编辑界面会显示父页面下拉框),不然get_post_ancestors拿不到祖先数据。
内容的提问来源于stack exchange,提问作者abbas_arezoo
相关产品推荐
相关产品推荐

