
很多人开始做 Z-BlogPHP 主题以后,最先卡住的不是不会写 HTML,而是不会拆模板。
最典型的几种乱法是:
- 首页、分类页、搜索页全堆进一个文件
header.php里塞了一堆页面专属逻辑- 文章详情和独立页面共用一套结构,最后谁都不合适
- 明明是逻辑问题,却在模板里反复复制判断
这篇我们就专门解决一件事:
Z-BlogPHP 模板到底该怎么拆,才能既跑得通,又好维护。
一、先记住:模板拆分不是为了好看,是为了职责清楚
很多人理解“拆模板”,会下意识想到前端组件化。
但在 Z-BlogPHP 里,更重要的不是炫技,而是三个目标:
- 公共部分只写一次
- 不同页面类型各有自己的位置
- 页面结构和展示逻辑尽量不要混成一锅
所以模板拆分最核心的问题不是:
- 能不能拆得很细
而是:
- 哪一层是公共的
- 哪一层是页面专属的
- 哪些判断该留在模板,哪些该回逻辑层
二、最常见的几个模板文件,各自负责什么
在 Z-BlogPHP 主题里,最常用的一批模板文件通常是:
header.phpfooter.phpindex.phpsingle.phppage.phpsearch.phpcomments.php404.php
你可以先把它们理解成下面这张职责图。
header.php
更像全站公共头部。
适合放:
<head>里的 title、meta、CSS- 公共导航
- 站点头部结构
footer.php
更像全站公共尾部。
适合放:
- 页脚结构
- 结尾脚本
- 公共尾部信息
index.php
更像列表页总入口。
通常承接:
- 首页
- 分类页
- 标签页
- 作者页
- 日期页
single.php
更像文章详情页。
通常承接:
- 文章标题
- 元信息
- 正文
- 标签
- 评论区
page.php
如果你单独做它,通常给独立页面用。
search.php
专门处理搜索结果。
comments.php
专门处理评论列表和评论表单。
三、首页和列表页,为什么通常从 index.php 起步
很多主题的 index.php 不只是首页。
它经常还负责:
- 分类列表
- 标签列表
- 作者列表
- 日期归档
所以 index.php 常常是“列表型页面”的总入口。
这类页面的共性通常有:
- 都要展示文章列表
- 都要有分页
- 都会有卡片或摘要结构
因此你拆的时候,可以先做一层共同结构,再按页面类型做小分支。
例如:
{template:header}
<main class="archive-main">
{if $type=='index'}
<h1>最新文章</h1>
{elseif $type=='category'}
<h1>{$category.Name}</h1>
{elseif $type=='tag'}
<h1>{$tag.Name}</h1>
{else}
<h1>文章列表</h1>
{/if}
{foreach $articles as $article}
<article class="post-card">
<h2><a href="{$article.Url}">{$article.Title}</a></h2>
<p>{$article.Intro}</p>
</article>
{/foreach}
</main>
{template:footer}
这个写法的关键不在于样式,而在于:
- 结构是共用的
- 页面类型差异只留在必要分支里
四、文章页为什么应该尽量独立给 single.php
详情页和列表页的目标完全不一样。
列表页更强调:
- 扫读
- 跳转
- 比较
详情页更强调:
- 阅读
- 结构完整
- 评论和延伸信息
所以文章页最好别混进 index.php。
一个最小的 single.php 大致可以这样起步:
{template:header}
<article class="post-single">
<header class="post-header">
<h1>{$article.Title}</h1>
<div class="post-meta">
<span>{$article.Author.Name}</span>
<span>{$article.Time('Y-m-d')}</span>
</div>
</header>
<div class="post-content">
{$article.Content}
</div>
{template:comments}
</article>
{template:footer}
这就是一个清晰的详情页骨架:
- 头部信息
- 正文区域
- 评论区域
后面再慢慢补:
- 相关推荐
- 目录
- 作者卡片
- 广告位
- 下载区
五、搜索页最好单独拆,不要完全依赖列表页回落
有些主题没有单独的 search.php,搜索结果会直接用 index.php。
能跑,但不够清楚。
因为搜索页通常至少有两件事和普通列表页不一样:
- 标题应该说明当前是搜索结果
- 空结果时要有专属提示
所以只要你打算认真做内容站,搜索页最好独立出来。
例如:
{template:header}
<main class="search-main">
<h1>搜索结果</h1>
{if count($articles)>0}
{foreach $articles as $article}
<article class="post-card">
<h2><a href="{$article.Url}">{$article.Title}</a></h2>
</article>
{/foreach}
{else}
<p>没有找到相关内容,请尝试更换关键词。</p>
{/if}
</main>
{template:footer}
这样后面你做搜索体验优化时,落点就非常明确。
六、公共区域怎么拆,才不会越拆越乱
模板拆分不是越碎越好。
很多人一开始就拆十几个片段,最后自己都找不到页面结构。
更稳的顺序是:
第一层,先拆全站公共部分
通常就是:
header.phpfooter.php
第二层,再拆高频复用区
比如:
comments.phpsidebar.phpnavbar.php
第三层,最后才拆页面内部片段
比如:
- 列表卡片片段
- 文章头部片段
- 相关推荐片段
除非你的主题已经比较成熟,否则不要一开始拆得过细。
七、模板里哪些逻辑可以留,哪些应该回 include.php
这是模板开发最常见的边界问题。
可以留在模板里的
- 页面类型分支
- 显示与否判断
- 遍历列表
- 结构顺序控制
- 少量显示相关条件
比如:
- 首页显示大标题,分类页显示分类名
- 有图就显示图,没有图就显示占位
这类判断留模板里通常没问题。
更适合回 include.php 的
- 复用的缩略图逻辑
- 复用的摘要截断逻辑
- 复用的时间格式逻辑
- 需要读配置再计算的派生值
- 多个模板都会用到的业务判断
一句话:
模板保留“怎么显示”,逻辑层负责“显示什么结果更合适”。
八、一个更实战的拆法思路
如果你现在要做一个内容站主题,建议按下面顺序拆:
第一步
先把:
header.phpfooter.phpindex.phpsingle.php
跑通。
第二步
把搜索页单独拆成:
search.php
第三步
把评论区单独拆成:
comments.php
第四步
如果分类页、标签页和首页差异越来越大,再考虑:
category.phptag.php
或者在 index.php 里做更清楚的分支。
九、模板开发里最常见的 6 个坑
1. 把所有页面都压进 index.php
短期省事,后面最难维护。
2. 在 header.php 写页面专属结构
header.php 更适合全站共用内容,不适合塞一堆详情页专属区块。
3. 把复用逻辑复制到多个模板
一旦缩略图、摘要、时间格式需要统一调整,就会很痛。
4. 搜索页没有独立处理空结果
对内容站来说,体验和 SEO 都不够好。
5. 评论区逻辑和详情页混写过重
后面调评论交互、审核提示、回复结构时会非常累。
6. 页面结构刚有点复杂,就开始无限拆片段
拆得过早、过碎,也会让主题越来越难看懂。
十、模板开发完成后,至少这样验证
写完模板以后,建议不要只看首页。
至少要逐个验证:
- 首页
- 分类页
- 标签页
- 文章详情页
- 搜索页
- 没有搜索结果时的状态
- 评论区是否正常显示
- 头部资源和尾部脚本是否正确加载
只要你开始把验证范围从“首页能开”扩大到“各页面类型都跑一遍”,模板问题会少很多。
结语
Z-BlogPHP 模板开发最重要的,不是把页面写出来,而是把页面类型和职责拆清楚。
你只要先把下面这套思路立住:
- 公共头尾单独拆
- 列表页从
index.php起 - 详情页从
single.php起 - 搜索页最好单独拆
- 评论区尽量独立
- 复用逻辑别在模板里到处复制
后面模板越写越多,结构也不容易失控。
下一篇我们继续讲主题配置项,怎么从后台设置,一路走到前台输出。
发表评论
发表评论