WordPress嵌套子页面选父页后自定义模板失效,求URL结构实现方案
核心原因
你遇到的问题本质是URL路由冲突:WordPress原生的分类归档URL规则就是 /category/{分类别名},当你创建slug为category的父页面,并将子页面的URL设为/category/{specific-category}时,系统会优先匹配内置的分类路由,而非你创建的自定义页面。这就导致访问该URL时,实际加载的是分类归档页面(而非你的自定义页面),自然会使用分类模板(如category.php)或默认的index.php,而页面属性中选中的自定义模板根本没被触发。
少数情况下主题或自定义代码通过template_include钩子修改了模板加载逻辑,也可能导致父页面存在时覆盖自定义模板选择,但路由冲突是最常见的诱因。
解决方案
方案1:修改原生分类的基础URL(最简单)
进入WordPress后台「设置」→「固定链接」,找到「分类基础」选项,把默认的category改成其他值(比如topics)。这样原生分类的URL会变成/topics/{分类别名},和你的页面URL/category/{specific-category}彻底错开,之后访问子页面时系统会正确识别为自定义页面,加载你选中的模板。
方案2:改用原生分类功能(更符合WordPress逻辑)
如果你的需求是做分类内容展示,没必要用页面嵌套,直接用原生分类功能更省心:
- 创建对应分类,设置分类slug为你需要的
specific-category; - 编写自定义分类模板:根据WordPress模板层级,创建
category-{slug}.php(针对单个分类)或category.php(通用分类模板),在模板里写你要的展示逻辑; - 这样默认URL就是
/category/{specific-category},完全符合你的需求,还不会有路由冲突问题。
方案3:修改路由优先级(坚持用页面嵌套时用)
如果你一定要用页面嵌套的方式,可通过代码调整重写规则,让页面路由优先于分类路由。在主题的functions.php文件中添加以下代码:
function custom_page_rewrite_rule() { add_rewrite_rule( '^category/([^/]+)/?$', 'index.php?pagename=category/$matches[1]', 'top' ); } add_action('init', 'custom_page_rewrite_rule');
添加后,去「设置」→「固定链接」页面点击「保存更改」刷新重写规则,之后/category/{specific-category}就会优先解析为你的子页面,加载你选中的自定义模板。
内容的提问来源于stack exchange,提问作者DaViDa

