做企业站或代理建站,经常会遇到这种情况:客户要一套完全不同的前台设计,但这套模板只属于这个客户,不能进产品包,也不该出现在别的站点里。KingCMS X1 的「私有主题」就是为这种场景准备的:放在站点的私有目录里,只有本站能看到,升级时不会被覆盖。

私有主题放在哪
默认目录是站点根下的 local/themes/<id>/(开发仓库里是 x1/local/themes/)。每个主题一个子目录,结构跟官方主题完全一致:theme.json 必需,templates/ 放 Twig 模板,assets/ 放图片样式,lang/ 放主题文案,preview.png 可选,用作后台预览图。
<id> 必须与 theme.json 里的 id 一致,只能用小写字母、数字、下划线和连字符。这个目录既不进 Git,也不进发布包和升级包;升级时整包替换,local/ 会原样保留。
最小清单
theme.json 至少要有 id、name、version、author 四个字段,缺一个或格式不对,这套主题会被跳过。常用字段还有 screenshot(预览图文件名)、supported_modules(依赖的模块)、options 与 ad_slots。后两项的校验规则和官方主题一样,非法结构会被忽略。
最省事的做法:复制官方主题再改
不要从零写。先把一套官方主题整目录复制到 local/themes/,改成自己的 id 和 name,再逐个页面替换模板和素材。需要哪些页面就提供哪些模板:找不到的模板会回落到官方 default 主题,最后才用模块自带模板,所以可以只改首页、列表和详情,其余先用默认。
主题资源走 /n/<id>/... 路径:先找官方主题根的 assets/,再找私有根的 assets/,都没有时回落到默认主题。主题文案则从主题实际所在的目录读取。

启用与冲突
放好目录后,后台「主题」列表会多出这套主题,并标注「私有」,可以预览、启用、删除;私有主题不提供在线模板编辑。启用后 theme.active 记录主题 id,切回官方主题不需要额外步骤。
有一条硬规则:同 id 时官方主题优先。如果私有目录里出现和官方主题同名的 id,官方主题照常显示,私有那份被跳过,同时写一条 error_log 并进入诊断列表,不会让站点报错。所以定制主题要换一个自己的 id,不要叫 default 或 furniture。
注意事项
- 备份:
local/不进发布包,升级虽然会保留,但仍要单独备份;换服务器时记得一起带走。 - 删除:删掉正在使用的私有主题后,当前主题会自动回落到
default,不会白屏。 - 版本:改主题时递增
version,方便排查线上到底用的哪一版。 - 授权:私有主题只解决「本站专属设计」,不能用来绕过商业授权或分发官方主题。
小结
私有主题把「客户定制」和「产品升级」分开了:设计放在 local/themes/,升级包只管内核和官方主题,两边互不覆盖。对代理和多站点运维来说,这比每次升级前手工合并模板要稳得多。