Z-Blog 主题模板文件清单:每个 .php 到底在什么时候被渲染

· zblog · 阅读 46
摘要

index、single、page 三个入口决定基调,header 与 footer 是所有页面骨架,评论拆成三个文件;附完整模板对照表和找不到模板时的回退规则。

打开一个 Z-Blog 主题的 template 目录,十几二十个文件排在那里,名字都眼熟但说不准哪个在什么时候被调用。一旦页面上某块内容不该出现却出现了,就得靠这份对应关系去定位。

一、主链:三个入口决定用哪套布局

Z-Blog 先根据当前访问决定「单页」还是「列表」,再决定具体文件。核心是 index.php 里的判断:

if ($zbp->current == 'index' || ...) {
    include $this->GetTemplate('index');
} elseif (...) {
    include $this->GetTemplate('single');
}

真正被 include 的文件由 $zbp->current 决定,取值有 index、category、tag、date、author、single、page、search,分别对应不同模板。

二、完整对照表

模板文件什么时候渲染对应 current
index.php首页、任意列表兜底index
list.php分类/标签/日期/作者列表(可选,缺则用 index)category 等
single.php文章详情single
page.php独立页面page
search.php搜索结果search
404.php访问不存在内容404
header.php每个页面的头部(被 include)—
footer.php每个页面的底部(被 include)—
sidebar.php侧栏(看模板里有没有 include)—
comment.php单条评论—
comments.php评论列表容器—
commentpost.php评论发表表单—
searchform.php搜索框(模块或模板内调用)—

list.php 是关键:很多主题根本没有这个文件,分类页直接套 index.php,只是通过 $type 变量区分标题和面包屑。所以判断「分类页用了哪个模板」不能只看文件存不存在。

三、header 与 footer 是所有页面的骨架

这两个文件决定了插件注入资源的位置。{$header} 和 {$footer} 两个标签分别承载 Filter_Plugin_Zbp_MakeTemplatetags 之类钩子追加的内容(CSS、JS、meta)。

如果主题里 header.php 漏了 {$header},大多数插件功能会静默失效——不报错,只是东西没出来。反过来,把 {$header} 放错位置(比如塞进 <body> 里),会导致 CSS 出现在 body 中,HTML 校验通不过。

另外记得:模板编译时 addNonexistentTags() 会自动补齐 {$header} 和 {$footer}(插到 </head> 前和 </body> 前)。所以自己写的裸模板也能跑,但位置由系统定,失去控制权。

四、评论被拆成三个文件

评论区块是拆得最细的一段,各有各的职责:

  • comments.php —— 列表容器,循环 include comment.php
  • comment.php —— 单条评论,包含头像、作者、时间、内容、回复按钮
  • commentpost.php —— 发表表单,含验证码区域(编译时自动插入)

常见的「评论样式改不动」问题,很多时候是改了 comment.php 但 comments.php 外面还包了一层旧 class 的 <ul>。要一起看。

还有一点:comment.php 里如果没有 id="cmt{ID}" 这个锚点,编译时会自动补一个 label。所以你在浏览器地址栏敲 #cmt5 能跳转,但 DOM 里那个 id 未必是你写的。

五、子模板怎么被引用

{template:header}

编译后变成 include $this->GetTemplate('header')。注意 GetTemplate() 找的是编译目录(zb_users/cache/compiled/主题/)下的 header.php,不是主题源码目录。

由此带来两个后果:

  1. 引用路径相对于编译根,不是当前文件所在目录
  2. 插件可以挂 Filter_Plugin_Template_GetTemplate 把某个子模板整个换掉,是「只替换评论模板」这类局部改造的正当入口

六、找不到模板会怎样

访问 404.php 不存在时,Z-Blog 会退回上一级模板,最终落到 index.php。所以不会白屏,而是显示首页布局——表现为「404 页面看着像首页」,容易被误判成伪静态规则写错。

排查方法:访问一个明确不存在的地址,看 HTTP 状态码。真 404 会返回 404 状态码,如果返回 200 但内容像首页,就是模板回退导致的。

七、theme.xml 里声明什么

主题根目录的 theme.xml 不需要列出每个模板文件,但它决定了主题名、版本、作者、依赖的核心版本。有些主题会在这里声明 <include> 和 <module>,对应可选的后台设置页和默认模块。

换主题后侧栏错乱,通常是旧主题的模块还在引导;这不属于模板文件的事,但和新主题的 theme.xml 声明是否完整有关。

小结

记住三条:三个入口(index/single/page)决定基调,header 和 footer 是所有页面的骨架,评论拆三个文件。剩下那些文件缺了都能回退,只有 header.php 里的 {$header} 位置错了才真正影响全局。