织梦模板开发终极指南 (远超58个技巧)
管理系统是国内使用非常广泛的CMS,其模板引擎使用的是{dede:}标签系统,掌握织梦模板开发,核心在于理解标签、熟悉函数、并学会自定义。

第一部分:基础入门与核心标签 (1-15)
这部分是织梦模板的基石,必须牢固掌握。
-
模板文件结构
index.html: 网站首页模板。head.html: 公共头部文件,包含<head>、网站导航等。footer.html: 公共底部文件,包含版权信息、友情链接等。article_list.html: 文章列表页模板。article_article.html: 文章内容页模板。search.php: 搜索结果页模板。templets/default/: 默认模板目录。
-
模板引擎入口
- 在所有模板文件的开头,必须加上:
{dede:global name='cfg_phpurl'/}/templets/system/ - 这个标签引入了织梦的核心函数库和标签库,没有它,大部分
{dede:}标签将无法工作。
- 在所有模板文件的开头,必须加上:
-
全局变量调用
(图片来源网络,侵删)- 调用网站配置信息:
{dede:global name='cfg_webname'/}: 网站名称{dede:global name='cfg_weburl'/}: 网站地址{dede:global name='cfg_powerby'/}: 网页版权信息{dede:global name='cfg_description'/}: 网站描述
- 调用网站配置信息:
-
文章列表循环
- 这是文章列表页的核心,用于循环输出文章。
{dede:arclist titlelen='30' row='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span> </li> {/dede:arclist}
- 这是文章列表页的核心,用于循环输出文章。
-
常用列表字段
[field:id/]: 文章ID[field:title/]: 文章标题[field:arcurl/]: 文章链接[field:pubdate/]: 发布时间(时间戳)[field:description/]: 文章摘要[field:litpic/]: 文章缩略图[field:click/]: 点击量[field:typename/]: 所属栏目名称
-
时间格式化
- 使用
function属性对时间戳进行格式化。 MyDate('Y-m-d H:i:s', @me): 格式为2025-10-27 15:30:00MyDate('m-d', @me): 格式为10-27strftime('%Y-%m-%d', @me): 另一种格式化方式。
- 使用
-
页
- 用于显示单篇文章的详细内容。
<h1>{dede:field.title/}</h1> <div class="info"> <span>发布时间:{dede:field.pubdate function="MyDate('Y-m-d', @me)"/}</span> <span>点击数:{dede:field.click/}</span> </div> <div class="content"> {dede:field.body/} </div>
- 用于显示单篇文章的详细内容。
-
内容页常用字段
{dede:field.title/}: 文章标题{dede:field.pubdate/}: 发布时间{dede:field.click/}: 点击量{dede:field.body/}: 文章正文{dede:field.keywords/}: 文章关键词{dede:field.description/}: 文章摘要
-
栏目列表循环
- 用于调用顶级栏目或指定栏目的子栏目。
{dede:channel type='top' row='8'} <li><a href="[field:typelink/]">[field:typename/]</a></li> {/dede:channel} type='top': 只调用顶级栏目。type='son'typeid='ID': 调用指定ID栏目的子栏目。
- 用于调用顶级栏目或指定栏目的子栏目。
-
栏目链接
[field:typelink/]: 栏目链接(包含完整的URL)[field:typeurl/]: 栏目链接(与typelink类似,有时表现不同)
-
分页标签
- 在列表页模板中,分页代码是固定的。
<div class="dede_pages"> <ul class="pagelist"> {dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/} </ul> </div>
- 在列表页模板中,分页代码是固定的。
-
调用友情链接
- 在
footer.html等页面常用。{dede:flink type='text' row='24'} [field:link/] {/dede:flink} type='text': 文字链接。type='image': 图片链接。
- 在
-
调用网站地图
- 生成网站地图,方便搜索引擎抓取。
<a href="{dede:global name='cfg_cmsurl'/}/sitemap.html">网站地图</a>
- 生成网站地图,方便搜索引擎抓取。
-
搜索表单
- 网站搜索功能的核心表单。
<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php"> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" id="searchtype" value="titlekeyword" /> <input name="q" type="text" class="search-keywords" id="search-keywords" placeholder="输入关键词..." /> <button type="submit">搜索</button> </form>
- 网站搜索功能的核心表单。
-
首页头部和底部引入
- 使用
include标签引入公共文件,是模块化开发的第一步。{dede:include filename="head.html"/} <!-- 页面主要内容 --> {dede:include filename="footer.html"/}
- 使用
第二部分:进阶技巧与常用功能 (16-35)
掌握了基础后,这些技巧能让你开发出更强大、更灵活的模板。
-
自定义字段
- 在后台“核心”->“内容模型管理”中为模型添加自定义字段(如:价格、品牌、作者简介等)。
- 页调用:
{dede:field.自定义字段名/}。 - 在列表页调用:
[field:自定义字段名/]。
-
arclist 高级属性
typeid='1,2,3': 指定栏目ID,多个用逗号隔开。row='20': 调用文章数量。titlelen='50': 标题长度。infolen='200':摘要长度。orderway='desc': 排序方式,desc降序,asc升序。orderby='pubdate': 按发布时间排序。click按点击量排序。
-
调用指定栏目下的文章
typeid属性是arclist的灵魂。<!-- 调用ID为5的栏目下的10篇文章 --> {dede:arclist typeid='5' row='10'} ... {/dede:arclist}
-
调用当前栏目的子栏目
- 在列表页或内容页,非常有用。
{dede:channel type='son' currentstyle="<li class='on'><a href='~typelink~'>~typename~</a></li>"} <li><a href="[field:typelink/]">[field:typename/]</a></li> {/dede:channel} currentstyle: 为当前栏目指定高亮样式。
- 在列表页或内容页,非常有用。
-
调用当前栏目的顶级栏目
- 用于面包屑导航或当前位置。
{dede:field name='typename'/} <!-- 当前栏目 --> {dede:field name='topid' runphp='yes'} $dsql = new DedeSql(false); $typeid = @me; $arr = $dsql->GetOne("SELECT typename,reid,topid FROM `dede_arctype` WHERE id=$typeid"); $topid = $arr['topid']; $topid = $topid == 0 ? $typeid : $topid; $row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id=$topid"); @me = $row['typename']; {/dede:field}
- 用于面包屑导航或当前位置。
-
面包屑导航
- 织梦内置了面包屑标签。
<a href="{dede:global name='cfg_cmsurl'/}/">首页</a> {dede:field name='position'/}
- 织梦内置了面包屑标签。
-
上一篇/下一篇
- 页常用。
<div class="prenext"> <p>上一篇:{dede:prenext get='pre'/}</p> <p>下一篇:{dede:prenext get='next'/}</p> </div>
- 页常用。
-
相关文章
- 根据关键词或当前栏目调用相关文章。
{dede:likeart titlelen='24' row='10'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:likeart}
- 根据关键词或当前栏目调用相关文章。
-
评论调用
- 在首页或列表页调用最新评论。
{dede:feedback row='5' titlelen='24'} <li><a href="[field:phpurl/]/plus/feedback.php?aid=[field:aid/]">[field:msg/]</a> ([field:username/])</li> {dede:feedback}
- 在首页或列表页调用最新评论。
-
幻灯片/焦点图
- 使用
arclist结合特定样式实现。{dede:arclist row='5' type='image.' imgwidth='300' imgheight='220'} <a href="[field:arcurl/]"><img src="[field:litpic/]" alt="[field:title/]" width="300" height="220" /></a> {/dede:arclist} type='image.'表示只调用有缩略图的文章。
- 使用
-
内容页分页
- 页,如果内容很长,需要分页。
{dede:pagebreak/} - 在后台发布文章时,使用
<!----->标记进行手动分页。
- 页,如果内容很长,需要分页。
-
调用特定栏目(非顶级)
- 直接使用
typeid即可,不限定type属性。
- 直接使用
-
优化
- 使用
{dede:pagelist/}的listitem属性可以显示“共X页”等信息,用于SEO。 - 更推荐使用PHP代码动态生成标题。
{dede:field.title/}_栏目名称_网站名称
- 使用
-
内容页图片集
- 对于图片模型,使用
{dede:field.body/}会默认只显示第一张图,需要使用特定标签循环输出。{dede:field.body/} <!-- 在后台内容模型-字段管理中,将body字段的“内容详细样式模板”修改为以下代码 --> <div class="pics"> {dede:img maxwidth='500' maxheight='375'} <a href="[field:imgsrc/]" target="_blank"><img src="[field:imgsrc/]" alt="[field:text/]" /></a> {/dede:img} </div>
- 对于图片模型,使用
-
使用PHP代码
- 在模板中直接使用PHP代码,实现更复杂的功能。
- 语法:
{dede:name runphp='yes'} $abc = "Hello World"; @me = $abc; // @me 代表标签本身的值 {/dede:name} - 示例:获取当前栏目ID。
{dede:field.typeid runphp='yes'} @me = "当前栏目ID是:".@me; {/dede:field.typeid}
-
调用子栏目及其文章
- 嵌套循环,先循环子栏目,再循环每个子栏目下的文章。
{dede:channel type='son' typeid='5'} <h2>[field:typename/]</h2> <ul> {dede:arclist row='5' titlelen='24' channelid='[field:id]'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} </ul> {/dede:channel}
- 嵌套循环,先循环子栏目,再循环每个子栏目下的文章。
-
列表页高亮当前栏目
- 结合
dede:channel的currentstyle属性。
- 结合
-
调用TAG标签
- 页或列表页调用文章的TAG。
{dede:tag sort='new' getall='0'} <a href="[field:link/]">[field:tag/]</a> {dede:tag}
- 页或列表页调用文章的TAG。
-
内容页缩略图
- 如果文章没有缩略图,可以显示一张默认图片。
[field:litpic runphp='yes'] if(@me == '') { @me = '/default/images/nopic.jpg'; } [/field:litpic]
- 如果文章没有缩略图,可以显示一张默认图片。
-
利用SQL标签
- 当内置标签无法满足需求时,可以直接执行SQL查询。
- 注意: 有一定的安全风险,务必做好过滤。
{dede:sql sql='SELECT * FROM `dede_archives` ORDER BY pubdate DESC LIMIT 10'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:sql}
第三部分:高级应用与性能优化 (36-58+)
能让你成为织梦开发高手,解决复杂问题并提升网站性能。
-
创建自定义模型
后台“核心”->“内容模型管理”->“增加一个内容模型”,可以创建产品、下载、软件等模型,并为它们创建独立的模板。
-
自定义模板文件
- 在模型管理中,可以为每个模型指定不同的列表页模板(如
product_list.html页模板(如product_article.html)。
- 在模型管理中,可以为每个模型指定不同的列表页模板(如
-
JS调用
- 通过JS方式输出,方便其他网站或前端框架调用。
- 在模板文件开头加上
{dede:config.savephpname=''/},然后创建一个.js如下:<?php $pv->Fields['typename'] = $this->TypeLink->TypeInfos['typename']; echo "document.write('".$pv->GetTempletsVar('list', 'default/list_article.htm')."');"; ?> - 在其他页面引入:
<script src="{dede:global name='cfg_cmsurl'/}/js/your_file.js"></script>
-
修改上传目录
后台“系统”->“基本参数”->“附件设置”,可以修改上传目录,避免与系统文件混淆。
-
使用dede标签制作幻灯片
- 除了
arclist,还可以使用{dede:flink/}或{dede:loop/}等标签,配合CSS和JS制作更复杂的幻灯片。
- 除了
-
利用
<link>标签引入CSS/JS- 在
head.html中,使用<link>或<script>标签引入外部资源,而不是内联,可以提高加载速度。
- 在
-
CSS和JS文件压缩
使用工具(如 Gulp, Grunt)或在线工具将CSS和JS文件进行压缩,减少文件体积。
-
开启静态化
后台“系统”->“系统设置”->“核心设置”,将“是否使用伪静态”或“生成HTML页”设置为“是”,能极大提升网站访问速度和SEO友好度。
-
生成栏目页
在后台“生成”->“一键更新所有”中,可以单独生成栏目页,更新栏目信息。
-
批量更新网站
“一键更新所有”功能,可以按顺序更新首页、栏目、内容、自定义等。
-
使用dede:loop循环任意表
loop标签比sql标签更灵活,可以循环指定数据表中的任意字段。{dede:loop table='dede_archives' sort='pubdate' row='10'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:loop}
-
内容页获取当前栏目ID
{dede:field.typeid/}
-
内容页获取顶级栏目ID
见第20条,使用PHP代码。
-
制作多语言网站
可以通过建立多个栏目(如“中文”、“English”),每个栏目对应一套模板,或者使用自定义字段存储不同语言内容。
-
修改分页样式
- 在
/include/arc.listview.class.php文件中,找到GetPageListST函数,可以修改分页的HTML输出结构,以匹配你的CSS。
- 在
-
调用指定会员发布的文章
- 使用
sql标签,通过mid字段筛选。{dede:sql sql="SELECT * FROM `dede_archives` WHERE mid=1 ORDER BY pubdate DESC LIMIT 10"} ... {/dede:sql}
- 使用
-
制作专题页面
- 后台“专题管理”可以创建专题,并为专题指定模板,专题模板中可以使用
{dede:arclist}调用专题内的文章。
- 后台“专题管理”可以创建专题,并为专题指定模板,专题模板中可以使用
-
利用缓存
- 织梦自带缓存机制,对于不经常变化的区块(如导航栏、热门文章),可以在后台开启全局缓存,或在标签中使用
cache='3600'属性(单位:秒)。{dede:arclist row='10' cache='3600'} ... {/dede:arclist}
- 织梦自带缓存机制,对于不经常变化的区块(如导航栏、热门文章),可以在后台开启全局缓存,或在标签中使用
-
自定义错误页面
- 在
/templets/system/目录下,可以修改error.htm模板,自定义404、500等错误页面。
- 在
-
使用
dede:include引入远程文件include标签支持引入远程文件,可用于共享导航或广告位。{dede:include url='http://www.example.com/nav.html' isapi='yes'/}
-
SEO优化技巧
-
{dede:global name='cfg_webname'/}_{dede:field.title/}(首页),{dede:field.title/}_{dede:field.typename/}_{dede:global name='cfg_webname'/}(栏目/内容页) -
<meta name="keywords" content="{dede:field.keywords/}" /> - 描述:
<meta name="description" content="{dede:field.description function='html2text(@me)'/}" />(用html2text函数过滤掉HTML标签)
-
-
调试技巧
- 如果标签不生效,首先检查
{dede:global name='cfg_phpurl'/}/templets/system/是否已引入。 - 使用浏览器的“开发者工具”查看网络请求和HTML源码,确认标签是否被正确解析。
- 对于PHP代码,可以
print_r()或var_dump()变量来查看其值。
- 如果标签不生效,首先检查
-
代码规范与注释
- 保持HTML、CSS、PHP代码的缩进和格式清晰。
- 在复杂的逻辑块或自定义函数前添加注释,方便后期维护。
第四部分:总结与最佳实践
- 模块化思维: 尽量使用
{dede:include/}将公共部分(头、尾、导航、侧边栏)拆分成独立文件。 - 命名规范: 为模板文件、CSS类名、JS函数名使用有意义的、统一的命名。
- 安全第一: 任何时候都不要直接信任用户输入,在自定义SQL或使用PHP代码时,务必对变量进行过滤和转义。
- 版本控制: 使用Git等工具管理你的模板代码,以防误操作导致文件丢失。
- 备份: 在修改核心文件(如
.class.php)前,务必备份原文件。 - 学习官方文档: 织梦官方论坛和文档是解决问题的第一手资料。
- 拥抱原生PHP: 当织梦标签的灵活性达到极限时,不要害怕直接在模板中写PHP代码,这能解决绝大多数复杂问题。
这份指南涵盖了织梦模板开发的绝大部分核心知识点和实用技巧,真正的“58个技巧”来源于您在实践中的不断摸索和总结,希望这份详尽的文档能成为您开发路上的得力助手!
