
Dedecms模版标签怎么用:常见标签的调用与修改方法
Dedecms(织梦)的模板标签用于把栏目、文章、站点配置等数据输出到 HTML 页面。理解标签的关键,不是记住所有参数,而是分清页面类型、数据来源和标签负责的工作:栏目页通常用列表标签输出当前栏目的文章,文章页用字段标签显示当前文章,公共头尾则通过包含标签复用。
本文以常见的 Dedecms 5.7 系列模板语法为例。不同分支、补丁版本和二次开发站点可能增删标签或调整字段,实际效果应以站点代码和后台生成结果为准。示例代码放在模板文件中使用,不是可直接粘贴到 PHP 源文件里的 PHP 代码。
一、先认识模板标签的基本结构
织梦模板中常见的标签大致有两种形式。一种是自闭合标签,例如全局变量和字段标签;另一种是有开始、结束部分的循环标签,循环体内放置每条记录的 HTML。
{dede:global.cfg_webname/}
{dede:arclist row='5'}
<li>[field:title/]</li>
{/dede:arclist}
上例中,{dede:arclist ...} 用来查询并循环输出文章;循环体里的 [field:title/] 是当前记录的标题。标签参数通常写在标签名后面,参数值用引号包住。模板中的标签不是浏览器能够执行的 HTML,必须由 Dedecms 模板解析、生成页面后,浏览器才能看到结果。
标签名称、参数和字段名要按实际模板解析器支持的写法使用。不要把 PHP 语法、其他 CMS 的模板语法或自定义标签直接当作 Dedecms 内置功能。遇到来源不明的模板,先查看原站使用的 Dedecms 版本、模板文件和二次开发代码。
二、全局变量和公共文件
1. 输出站点配置
dede:global 常用于读取全局配置变量。常见例子是网站名称、网址和网站描述。变量是否存在,取决于站点配置和程序版本;拼写错误或配置项未定义时,可能输出为空。
<title>{dede:global.cfg_webname/}</title>
<a href="{dede:global.cfg_basehost/}">返回首页</a>
<meta name="description" content="{dede:global.cfg_description/}">
修改网站名称、网址或描述时,通常应先在后台的系统基本参数中检查对应配置,再决定是否改模板。直接把固定文本写进模板,虽然简单,但以后修改配置时容易出现前后台不一致。输出网址时也要确认站点配置中的协议、域名和目录设置正确,尤其是迁移网站或启用 HTTPS 之后。
2. 用 include 复用头部和尾部
dede:include 可以把公共模板文件嵌入当前模板,常用于头部、导航、侧栏和页脚。文件名一般相对于当前模板目录解析;不同站点可能使用不同目录结构,保存前先确认实际文件路径。
{dede:include filename="head.htm"/}
<main>
<h1>页面主体</h1>
</main>
{dede:include filename="footer.htm"/}
如果修改了公共头部,所有引用它的页面都可能受到影响。排查异常时,可以先检查包含文件是否存在、文件名大小写是否一致,以及当前模板是否指向了预期的模板目录。不要因为页面没有更新,就反复修改标签;静态页面尚未重新生成、缓存仍在生效,也是常见原因。
三、输出当前页面字段
dede:field 常用于栏目页、文章页等上下文页面,读取当前页面对应的字段。常见字段包括标题、栏目名称等。可用字段会随页面类型、内容模型和站点定制而不同,不能假定任意字段在每个页面都能直接读取。
<h1>{dede:field name='title'/}</h1>
<div class="breadcrumb">
{dede:field name='position'/}
</div>
文章页通常需要显示当前文章标题、发布时间、作者或正文;栏目页则可能显示栏目名称、栏目简介和栏目内容。若某个字段为空,先判断当前页面类型是否提供该字段,再核对字段名和内容模型设置。自定义字段还要确认字段已在后台内容模型中建立,并且当前模板所用的数据查询确实包含它。
字段标签与列表循环中的字段标签不要混淆:当前页面的字段常写成 {dede:field name='title'/};在文章列表循环体内,则常写成 [field:title/]。把后者放到循环外,或把前者当作循环记录字段使用,都可能取不到预期内容。
四、用 arclist 输出文章列表
dede:arclist 是常见的文章列表标签,适合在首页、栏目页侧栏、专题页等位置调用文章记录。它会按查询结果重复输出标签体中的内容。
<ul class="article-list">
{dede:arclist row='8' typeid='1' titlelen='40' orderby='pubdate' orderway='desc'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
</ul>
这个例子指定栏目 ID 为 1,最多输出 8 条记录,按发布时间倒序排列。部署时应把 typeid='1' 改成站点中真实存在的栏目 ID。row 用来限制本次标签输出的记录数量,不等同于栏目列表页的分页条数;要实现可翻页的栏目文章列表,应使用列表页标签和分页标签。
typeid:用于限定栏目范围。站点是否支持多栏目写法或特殊值,需查该版本文档及程序实现,不要凭经验拼接。titlelen:控制标题输出长度。其截断细节可能受程序版本与字符编码影响;中文字符在不同编码和实现下的表现不一定一致,需在实际页面检查是否截断合适。orderby、orderway:用于排序。示例按发布时间倒序;可用排序字段以当前版本的标签实现为准,未知字段不应直接套用。[field:arcurl/]、[field:title/]:分别用于记录链接和标题。列表循环外没有当前记录上下文,不能期待它们自动输出某篇文章的数据。
如果只看到部分文章,先确认查询栏目是否选对、记录是否属于该栏目、文章是否处于可发布状态,以及 row 是否限制了数量。列表为空也可能是模板没有重新生成,或标签所在页面并没有使用当前编辑的模板。
五、栏目导航与栏目文章页
dede:channel 常用于生成栏目链接。常见用法是按栏目层级输出导航。以下示例用于输出顶级栏目;栏目层级、当前栏目位置及栏目是否在后台设置为显示,都会影响结果。
<nav>
<ul>
{dede:channel type='top' row='10'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</nav>
type='top' 常用于顶级栏目,type='son' 常用于子栏目场景。要输出某个指定栏目下的子栏目,通常还需要正确设置栏目范围;参数含义和当前栏目上下文会受模板页面及程序版本影响。不要只因为导航没有显示子栏目,就把 type 随意改成其他值,应先核对当前页面所属栏目和标签支持的参数。
栏目列表页通常需要输出当前栏目的文章,并支持分页。Dedecms 常见写法是在列表模板中使用 dede:list,在列表之后输出分页导航:
<ul class="article-list">
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]></span>
</li>
{/dede:list}
</ul>
<div class="pagination">
{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}
</div>
pagesize 用于设置每页列表记录数,pagelist 用于输出分页导航。两者应与栏目列表页的生成流程配合使用,不能把这段代码随便放进一个普通静态页面,就期待自动得到完整分页。若每页条数或分页链接与后台设置不一致,应检查栏目列表模板、栏目分页设置和静态页面生成状态。
六、日期格式和函数参数
示例中的日期写法使用了 Dedecms 模板中常见的字段函数形式:
[field:pubdate function="MyDate('Y-m-d',@me)"/]
这里的 pubdate 是文章记录字段,MyDate 用来格式化日期,@me 表示将当前字段值传给函数。日期格式字符串可按 PHP 日期格式规则调整,例如 Y-m-d 表示年月日。不同版本的函数注册和模板解析细节可能有差异;如果页面原样显示标签、报错或输出为空,应核对函数是否可用、引号是否配对,以及字段本身是否有值。
函数标签不是通用的安全沙箱,也不适合把用户输入拼成函数名或参数后执行。模板设计者只应调用程序明确支持、且用途清楚的函数。不要为了绕过模板限制而开启任意 PHP 执行或将不可信内容传入动态调用。
七、模板修改与发布流程
- 确认页面类型。先判断要改的是首页、栏目列表页、文章页还是公共组件。不同页面使用的模板文件及可用字段不同。
- 确认模板目录。在后台检查当前使用的模板方案和默认模板目录,再找到实际生效的文件。多个旧模板并存时,编辑错误文件是常见原因。
- 小步修改。先复制备份,再改一处标签并保存。使用准确的栏目 ID、字段名和标签闭合结构,避免一次改动大量文件,增加定位成本。
- 重新生成页面。Dedecms 站点常使用静态页面。模板文件保存后,已经生成的 HTML 不一定自动更新;应按站点发布流程重新生成对应栏目或文章页面,并清理相关缓存。
- 检查生成结果。查看浏览器实际收到的 HTML 和页面链接,确认标签已被解析、字段有值、链接正确、分页可用。若模板标签原样出现在页面中,优先检查标签拼写、闭合方式和页面是否经过 Dedecms 解析。
如果站点开启了模板缓存、第三方缓存或 CDN,生成页面后仍可能看到旧内容。排查时应逐层确认:源模板是否改对、静态文件是否重新生成、程序缓存是否清理、外部缓存是否刷新。不要把浏览器刷新当成重新生成静态页面。
八、常见错误与排查方向
标签输出为空
检查当前页面是否有该字段或数据;查询栏目 ID 是否正确;文章是否已发布;标签是否放在具备相应上下文的页面中。再核对模板目录和生成流程,避免实际访问的是另一套模板或旧静态文件。
标签原样显示
检查大括号、标签名、引号和结束标记是否正确。循环标签必须有对应的结束标签;自闭合标签的结尾形式也要符合当前模板写法。还要确认文件确实是 Dedecms 模板,而不是未经解析的普通 HTML 文件。
列表数量或顺序不对
区分 arclist 的输出条数与 list 的每页条数。再检查栏目范围、排序字段、排序方向和文章状态。排序结果相同时,记录的发布时间或其他排序值可能相同,因此看起来未必严格符合预想的先后顺序。
标题被截断或乱码
先核对 HTML 文件、网站数据库和程序设置的字符编码是否一致,再调整 titlelen。截断长度和多字节字符处理会因版本及实现而异,不应假定参数数字始终等同于用户看到的字符数。修改后用包含中文、英文和标点的真实标题测试。
链接错误或分页失效
检查站点域名配置、栏目目录设置、静态页面规则和生成路径。分页标签应放在支持分页的列表页模板中;普通文章页或首页并不会因为加入分页标签就自动拥有列表分页数据。
九、输出安全:模板不会自动替你判断信任边界
模板负责输出内容,不应被当作自动安全过滤器。是否存在 HTML 转义、标签过滤或内容清洗,取决于具体字段、程序版本、后台录入流程和二次开发。不要假定 [field:title/]、自定义字段或全局配置值一定会自动进行 HTML 转义。
普通文本应在合适的输出上下文中进行转义:文本节点和 HTML 属性是不同上下文,URL、JavaScript 与 CSS 也各有不同的校验要求。尤其是把字段放进 href、title、脚本或样式中时,不能仅靠加引号解决注入问题。对于可由投稿者、会员或外部接口写入的内容,应在后端按业务需求做校验、清洗和权限控制,并在输出处使用与上下文匹配的安全处理。
文章正文往往需要保留一定 HTML,因此不能简单地把所有正文当普通文本转义;但这也不意味着可以无条件输出不可信 HTML。应明确哪些角色可以提交富文本、允许哪些标签与属性,并使用经过验证的内容清洗流程。不要把用户可控的字符串拼进可执行的模板表达式或 PHP 代码。
Dedecms 老站还应关注程序补丁、后台访问权限、文件写入权限和站点备份。模板标签本身不是网站安全方案;对来历不明的模板文件、插件和可执行代码,应先审查后再部署。
结语
使用 Dedecms 模板标签,可以按“页面类型—数据来源—输出结构”的顺序来判断:全局配置用 dede:global,当前页面字段用 dede:field,通用文章查询常用 dede:arclist,栏目导航可用 dede:channel,栏目分页列表常用 dede:list 配合 dede:pagelist,公共结构则通过 dede:include 复用。
遇到问题时,先核对实际模板文件、页面上下文和字段可用性,再检查参数、生成状态与缓存;涉及外部输入时,不要假定模板会自动完成安全过滤。掌握这些边界后,再按站点版本验证参数,就能更稳妥地修改现有模板,也更容易定位标签无输出、数据错误或页面未更新等问题。







