风格系统:一个目录就是一套皮肤
一套风格长什么样
wp-content/themes/my-style/
├── tpl.json # 6 类页面的 HTML 骨架
├── style.css # 样式
└── ... # 图片、字体、JS
tpl.json 的结构:
{
"name": "我的风格",
"tpl": {
"pageHome": "<!DOCTYPE html>...",
"pageCategory": "...",
"pageTag": "...",
"pageArchive": "...",
"single": "...",
"item": "..."
},
"sidebar": { "categories": "...", "archives": "...", "tags": "..." },
"comments": { "list": "...", "entry": "...", "children": "...", "form": "..." }
}
item 是列表里单张卡片的骨架;sidebar 和 comments 是可选片段,缺省时用内置骨架。
占位符
模板里用 {{XXX}} 标记要填的值,用 {{#IF_XXX}}...{{/IF_XXX}} 做条件块。
常用的:
| 占位符 | 用在哪 | 含义 |
|---|---|---|
{{SITE_NAME}} / {{SITE_DESC}} / {{SITE_URL}} |
全部 | 站点信息 |
{{MENU}} |
全部 | 导航菜单 |
{{CONTENT}} |
列表页 | 渲染好的文章卡片列表 |
{{TITLE}} |
列表页 | 分类名 / 标签名 / 归档标题 |
{{POST_TITLE}} / {{POST_CONTENT}} / {{POST_DATE}} |
单页 | 文章字段 |
{{POST_URL}} / {{POST_EXCERPT}} |
条目 | 文章链接与摘要 |
{{PAGINATION_PREV}} / {{PAGINATION_NEXT}} |
列表页 | 翻页 |
{{SIDEBAR_CATEGORIES}} |
全部 | 分类列表片段 |
规则很简单:占位符必须和渲染器实现一致。写了未实现的占位符不会报错,但出口会被静默清空——所以改模板后最好在预览里检查一遍。
在线换肤
后台 → 模板 → 风格应用 → 选一个 → 应用。
背后只做了一件事:把 settings 表里 k='style' 的 active 改成风格 id。列表页下次请求就会用新模板渲染。
单页不会自动变。因为单页是 R2 里的静态快照,必须重建才会重新套模板。这也是为什么后台把「应用风格」和「重建全部单页」放在相邻的位置。
上传自己的风格
两种方式:
- 后台上传:模板 → 上传风格,选择一个目录(会递归读取文件),逐个写入 R2;
- 放进内置目录:把目录放到
worker/static/wp-content/themes/<id>/,npm run deploy。
内置风格会进 themes/index.json,所有部署都能看到;用户风格只存在 R2,换设备也在。
编辑模板
后台的可视化编辑器按 6 类页面分页签,支持:
- 直接改 HTML;
- 查看当前页面可用的占位符;
- 保存后预览;
- 切到 JSON 源码模式改整个文件。
保存前会把旧 tpl.json 备份为 tpl.json.bak,出问题可以回退。