dedecms二次开发手册
dedecms(织梦CMS)作为国内早期广泛使用的开源内容管理系统,拥有庞大的用户基础和成熟的架构,虽然官方已停止更新,但众多存量站点仍需维护、功能扩展与安全加固,深入理解其二次开发机制,是高效定制、安全运维的关键。

环境准备与基础认知
- 环境要求: PHP 5.3 – 7.x (推荐5.6/7.2,高版本需注意兼容性),MySQL 4.1+,Apache/Nginx。
- 核心目录:
/include/:核心函数库、类库、公用文件 (如common.inc.php,dedesql.class.php)。/templets/:系统默认模板、风格目录。自定义模板强烈建议新建目录存放于此。/data/:缓存、配置、上传文件等。权限设置至关重要 (建议config.php,common.inc.php等设置为644或更严格)。/dede/:后台管理目录 (强烈建议重命名以增强安全性)。/plus/:插件、功能模块目录 (如留言板、投票等)。
- 核心机制:
- 模板引擎: 虽非Smarty等现代引擎,但采用
{dede:tagName /}标签机制,解析过程:PHP程序读取模板 -> 替换标签为对应PHP代码 -> 生成最终HTML,理解标签底层对应的PHP函数是深度开发基础。 - 文档模型: 核心内容存储单元,理解主表
dede_archives与附加表dede_addon[模型名称]的关系及字段映射。 - 标签缓存: 默认启用,提升性能,开发调试时可临时关闭
/data/cache/下的缓存,上线务必开启。
- 模板引擎: 虽非Smarty等现代引擎,但采用
核心开发场景与实战
-
深度模板定制
- 创建独立模板目录: 在
/templets/下新建目录(如my_style),复制默认模板文件修改,在后台“系统”-“系统基本参数”-“核心设置”中指定“默认模板风格”为my_style。 - 解析核心标签: 不要满足于文档,直接查看
/include/taglib/下对应标签文件(如arclist.lib.php),理解{dede:arclist}如何通过lib_arclist函数执行SQL并渲染。 - 自定义标签:
- 在
/include/taglib/下创建文件mytag.lib.php。 - 编写函数:
function lib_mytag(&$ctag, &$refObj) { ... return $revalue; }。 - 在模板中使用
{dede:mytag attr1='value1' /}。注意: 参数通过$ctag->GetAtt('attr1')获取,务必进行安全过滤。
- 在
- 动态区块: 利用
{dede:channelartlist}、{dede:type}等结合PHP条件逻辑实现复杂布局。
- 创建独立模板目录: 在
-
功能模块扩展

- 利用
/plus/目录: 创建独立PHP文件(如/plus/mymodule.php),通过URL直接访问(yoursite.com/plus/mymodule.php)。 - 集成后台:
- 在
/dede/(已重命名目录)下创建菜单文件,如mymenu.php,定义菜单项。 - 创建管理主文件
/dede/mymodule_main.php,处理增删改查逻辑。 - 安全要点: 严格校验管理员权限(
TestPurview())、过滤所有用户输入、使用系统数据库类$dsql执行SQL。
- 在
- 扩展现有模型:
- 修改对应附加表结构(
dede_addon[模型名])。 - 在后台管理对应模型的字段管理中添加新字段。
- 修改发布/编辑模板(
/dede/templets/下对应article_add.htm,article_edit.htm等),添加表单元素。 - 修改处理程序(如
/dede/archives_do.php),保存和读取新字段数据。 - 在模板标签中输出新字段(可能需要修改对应标签库文件或使用
{dede:field.name /})。
- 修改对应附加表结构(
- 利用
-
API接口开发
- 创建独立入口: 在根目录或
/api/下创建index.php(避免使用plus目录)。 - 引入核心:
require_once (dirname(__FILE__) . '/include/common.inc.php');。 - 权限验证: 实现Token验证、签名验证或简单的API Key机制,避免直接暴露后台登录。
- 数据处理:
- 使用
$dsql安全操作数据库。 - 输入:
filter_var($_GET['param'], FILTER_SANITIZE_STRING)。 - 输出:
header('Content-Type: application/json'); echo json_encode($data);。
- 使用
- 路由: 可采用简单参数区分功能,如
/api/?v=1&action=getnews&catid=1。
- 创建独立入口: 在根目录或
安全加固:二次开发的生命线
- 输入过滤: 所有来自
$_GET,$_POST,$_COOKIE,$_REQUEST的数据必须视为不可信,使用$dsql->SetQuery()的预编译或addslashes()(注意字符集,推荐mysql_real_escape_string但需连接) + 类型强制转换,对富文本使用HTMLPurifier等严格过滤。 - 输出转义: 在HTML中输出变量时,必须用
htmlspecialchars($var, ENT_QUOTES, 'UTF-8')转义,在JS中输出,用json_encode()。 - 文件上传:
- 严格限制文件类型(
$cfg_allowed_mime_types)、后缀名。 - 使用
$upload = new UploadFile(); $upload->SetMaxSize(); $upload->SetAllowMime(); $upload->SaveTo();系统类,并检查$upload->errorCode。 - 禁止上传目录执行权限! (Nginx:
location ~ ^/uploads/..(php|php5)$ { deny all; })。
- 严格限制文件类型(
- SQL注入防护: 绝对禁止直接拼接SQL语句,坚持使用:
$sql = "SELECT FROM `dede_archives` WHERE id = ?"; $dsql->SetQuery($sql); $dsql->Execute('id', $id); // $id 来自过滤后的输入 - 目录权限:
/data/,/uploads/目录设置755或更严格,确保PHP进程用户可写但不可执行。config.php,common.inc.php设置为644。 - 后台安全: 必须重命名
/dede/目录,启用强密码、定期修改,限制后台登录IP(修改/include/common.inc.php,添加IP检查代码)。
高阶技巧与最佳实践
- 性能优化:
- 标签缓存: 确保生产环境开启。
- SQL优化: 避免
{dede:arclist}等标签嵌套过深或row值过大,使用channel标签替代type标签获取栏目列表效率更高,善用att属性限制查询字段。 - 静态化: 对高访问量且更新不频繁的栏目/文档,利用系统生成HTML或结合Nginx缓存。
- OPcache: 启用PHP OPcache显著提升PHP执行效率。
- 现代化改造:
- Composer集成: 在项目根目录添加
composer.json,使用require_once __DIR__ . '/vendor/autoload.php';引入现代PHP库(注意命名空间冲突)。 - 前后端分离: 将dedecms作为后端数据源,通过开发的API供Vue/React等前端框架调用。
- Composer集成: 在项目根目录添加
- 调试技巧:
echo "<pre>"; print_r($var); exit;传统有效。- 开启
/data/config.cache.inc.php中的$cfg_debug = 'true';(线上环境务必关闭!)。 - 查看
/data/mysql_error_trace.inc记录SQL错误。
- 版本控制: 使用Git管理
/templets/,/include/taglib/, 自定义模块目录等核心修改,避免直接覆盖官方核心文件。
dedecms二次开发的核心在于理解其“约定大于配置”的设计哲学和数据库结构,在官方支持停止的背景下,安全意识和自主掌控能力尤为重要,每一次开发都应以“最小修改”、“安全优先”为原则,并做好详尽的注释和文档记录,确保项目的长期可维护性。

你在dedecms二次开发中遇到最棘手的问题是什么?是某个特定标签的深度定制、安全漏洞的修复,还是老旧代码与现代技术的整合?欢迎在评论区分享你的挑战与解决方案,共同探讨织梦系统的深度应用与安全实践。
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/8097.html