Discuz 模板怎么安装启用?目录结构、缓存清理与常见报错排查
Discuz! X3.x/X5 装好后皮肤千篇一律,很多人第一次改模板都会遇到同一个问题:后台明明启用了新模板,前台却还是旧样式,或者整页 500。本文按“目录结构 → 上传 → 启用 → 排错”的顺序走一遍。

一、先搞清模板的存放结构
Discuz 模板文件统一放在 ./template/ 下,每个模板一个同名目录,目录里再按模块分子目录:
template/
└── mytheme/
├── common/ # 公共:header、footer、nav、member 等
├── forum/ # 论坛板块页、帖子页(discuz_template)
├── group/ home/ space/ user/ ...
└── css/ images/js
```
模板的文件后缀是 .htm,内容不是纯 HTML,而是 Discuz 自己的模板标签语法:{template common/header} 引入子模板、{loop $threadlist $thread} 循环、$G['setting']['sitename']} 输出全局变量、{if}...{elseif}...{/if} 条件。改这些文件时别当成普通 HTML 保存。
子目录命名与模块一一对应,路径必须是 template/模板目录名/模块名/文件名.htm。放错目录不会报错,只会“看起来没生效”,这是新手最大的坑。
二、下载模板的正规渠道
- 官方应用中心(Discuz! 官网的“模板/插件”区)与官方仓库
https://gitee.com/discuz系列; - 第三方站点下载的模板,务必检查是否含
.php后门代码。Discuz 模板目录正常不应该有 php 文件,看到cache.php、dbback.php之类要立刻删掉。
三、上传与权限
- FTP/面板上传整个
mytheme文件夹到./template/; - 目录权限 755、文件 644;
data/目录必须可写(编译缓存写在这里); - 不要用
chmod 777解决权限问题,那是安全漏洞的开端。
四、后台启用(两种方式)
全站默认模板:后台 → 界面 → 模板风格/界面风格 → 管理模板 → 右上角“选为默认”,或直接在“界面 → 默认模板风格”里切换。
指定论坛/分区用不同模板:后台 → 论坛 → 分区/板块管理 → 模板设置里为某个 forumid 指定模板,可实现首页一套皮肤、某板块另一套。
手机端模板:X3.x 起移动端有独立模板目录(touch 相关风格),在“界面 → 移动端设置”里选择,桌面版换了不代表手机端同步。
五、必须清缓存
Discuz 会把模板编译成 PHP 缓存放进 data/template/。改完模板不清缓存 = 白改。三种做法:
- 后台 → 工具 → 更新缓存 → 勾“模板缓存”;
- 删除
data/template/*.tpl.php(会自动重新编译),但别删data/下其它文件; - 开发期可在
config/config_global.php里关闭模板缓存检查($_config['template']['refresh'] = 1;一类的调试开关,视版本而定),上线后关闭。
六、常见报错
- 500 白屏:模板语法错误({loop} 少 {/loop}、引号不配对)。打开
config/config_global.php的$_config['debug'] = 1;并设error_reporting(E_ALL)看具体行;或直接查data/log/。 - Discuz! Template "xxx" is not exists:模板目录名和后台填写的不一致,或大小写不同(Linux 区分大小写)。
- 样式错乱、图片丢失:CSS/图片的相对路径基于模板目录,检查
{IMG}/{CSS}标签生成的 URL 是否 404,常见于把模板传到子目录后$stylepath没对应上。 - 插件与模板冲突:插件常通过钩子(hook)往模板注入代码,卸载插件后要重建模板缓存,否则报 hook 未定义。
七、修改建议与常见问题 FAQ
正确做法是复制官方模板再改(Discuz 官方推荐的“父模板继承”思路:新建目录里只放需要覆盖的 .htm,其余靠继承链回落到默认模板),别直接改 default,否则升级全丢。
问:Discuz! X5 和 X3.5 的模板能通用吗?
答:不保证。X5 的模板语法与部分全局变量结构调整过,官方模板目录也不同名,混用容易出现变量为空的错误。
问:怎么快速定位是哪个 .htm 输出的某块 HTML?
答:浏览器查看源码里的特征文字,再到 template/你的模板/ 下全文搜索该字符串;找不到就在 source/module/ 里搜,说明它是 PHP 直接输出的。
问:改了 header 为什么不生效而 footer 生效?
答:页面用了 output() / exit() 提前结束的分支(如 AJAX 请求),或该页走的是另一个模块模板。
记住顺序:放对目录 → 后台选模板 → 清模板缓存 → 再报错就看 debug。九成“模板装了没反应”的问题出在第三步。
生产内容,同时打通搜索引擎(SEO)与AI搜索引擎(GEO)流量入口的软件! 点击进入365建站器 »
