目录
- 第一步:理解织梦标签的运行机制
- 第二步:制作一个简单的自定义标签(入门级)
- 场景:获取网站名称
- 步骤详解
- 第三步:制作一个带参数的自定义标签(进阶级)
- 场景:获取指定分类下的文章列表
- 步骤详解
- 第四步:制作一个更复杂的SQL查询标签(高级级)
- 场景:获取指定时间范围内的热门文章
- 步骤详解
- 第五步:标签的调用与管理
- 在模板中如何调用
- 如何管理和查看已添加的标签
- 常见问题与注意事项
第一步:理解织梦标签的运行机制
在开始制作之前,你需要明白织梦标签是如何工作的:

(图片来源网络,侵删)
- 触发:当织梦解析模板文件(
.htm)时,遇到一个{dede:标签名 /}或{dede:标签名}...{/dede:标签名}这样的结构。 - 解析:织梦系统会根据标签名,去一个固定的目录下寻找对应的PHP处理文件。
- 执行:找到并执行这个PHP文件,这个PHP文件负责从数据库中获取数据,或者进行其他业务逻辑处理。
- 返回:PHP文件处理完毕后,将处理结果(通常是HTML代码字符串)返回给模板解析引擎。
- 替换:模板引擎将原始的标签(如
{dede:mytag /})替换为返回的HTML代码。
核心文件位置:
织梦的自定义标签处理文件统一存放在 /include/taglib/ 目录下,这个目录是关键,你所有的自定义标签PHP文件都必须放在这里。
第二步:制作一个简单的自定义标签(入门级)
假设我们要创建一个标签 {dede:mywebname /},它的功能是直接输出网站的全局名称。
场景:获取网站名称
步骤详解:
-
创建标签处理文件
- 在
/include/taglib/目录下,新建一个名为mywebname.lib.php的文件。 - 文件名规则:
标签名.lib.php,我们的标签名是mywebname,所以文件名就是mywebname.lib.php。
- 在
-
编写PHP代码
(图片来源网络,侵删)- 打开
mywebname.lib.php文件,输入以下代码:
<?php if (!defined('DEDEINC')) { exit('Request Error!'); } // function标签的固定写法,标签名就是文件名 function lib_mywebname(&$ctag, &$refObj) { // 获取网站配置信息中的站点名称 $site_name = $GLOBALS['cfg_webname']; // 返回需要替换到模板中的内容 return $site_name; } ?>- 代码解析:
if (!defined('DEDEINC')) exit('Request Error!');:这是织梦文件的标准开头,用于安全检查,防止直接访问。function lib_mywebname(&$ctag, &$refObj):这是自定义标签的固定函数格式,函数名必须是lib_+ 你的标签名。$ctag:标签本身的对象,可以从中获取标签的属性。$refObj:引用对象,通常用于获取当前环境的信息(如当前栏目ID等)。
$GLOBALS['cfg_webname']:这是织梦的全局变量,存储了网站后台设置的“网站名称”。return $site_name;:函数必须返回一个字符串,这个字符串就是模板中标签位置将被替换成的最终内容。
- 打开
-
在模板中使用标签
- 打开任意一个模板文件(
index.htm),在需要显示网站名称的地方,使用你刚刚创建的标签:<h1>欢迎来到 {dede:mywebname /} !</h1>
- 打开任意一个模板文件(
-
生成并查看效果
- 在织梦后台,点击“生成” -> “更新主页”,或者直接更新包含此标签的页面。
- 打开生成的HTML文件,你会看到
<h1>欢迎来到 我的织梦网站 !</h1>,我的织梦网站就是你的网站名称。
第三步:制作一个带参数的自定义标签(进阶级)
大多数时候,我们需要标签能根据传入的参数动态变化,下面我们制作一个标签,用于获取指定分类下的文章列表。
场景:获取指定分类下的文章列表
步骤详解:
-
创建标签处理文件
(图片来源网络,侵删)- 在
/include/taglib/目录下,新建一个名为myarclist.lib.php的文件。
- 在
-
编写PHP代码
- 打开
myarclist.lib.php文件,输入以下代码:
<?php if (!defined('DEDEINC')) { exit('Request Error!'); } function lib_myarclist(&$ctag, &$refObj) { // 1. 初始化数组,用于存放查询条件和最终数据 $attlist = 'typeid|0,row|10,titlelen|30'; $ctp = new DedeTagParse(); $ctp->SetRefObj($refObj); $ctp->SetNameSpace('field', '[', ']'); $atts = DedeAttributeParse($ctag->GetAtt(), $attlist); $typeid = $atts['typeid']; // 获取typeid属性 $row = $atts['row']; // 获取row属性 $titlelen = $atts['titlelen']; // 获取titlelen属性 // 2. 构建SQL查询语句 $sql = "SELECT id, title, pubdate FROM dede_archives WHERE typeid='$typeid' ORDER BY id DESC LIMIT 0, $row"; // 3. 执行查询并处理数据 $dsql = new DedeSql(false); $dsql->SetQuery($sql); $dsql->Execute('me'); $artlist = ''; while ($row = $dsql->GetArray('me')) { $title_cn = cn_substr($row['title'], $titlelen); // 截取标题 $pubdate = MyDate('Y-m-d', $row['pubdate']); // 格式化日期 $artlist .= "<li><a href='/view.php?aid={$row['id']}'>{$title_cn}</a> ({$pubdate})</li>\n"; } $dsql->Close(); // 4. 返回结果 return $artlist; } ?>- 代码解析:
$attlist = 'typeid|0,row|10,titlelen|30';:定义标签允许的属性及其默认值,格式为属性名|默认值,多个属性用 分隔。$atts = DedeAttributeParse(...):这是织梦内置的函数,用于解析标签的属性,并将其与$attlist中定义的属性进行匹配,返回一个包含所有属性值的数组。$typeid = $atts['typeid'];:从解析后的数组中获取typeid属性的值。- SQL查询:根据传入的
typeid、row等参数,构建查询语句,从dede_archives表中获取文章数据。 - 循环处理:遍历查询结果,使用
cn_substr截取标题,MyDate格式化日期,并拼接成HTML列表字符串。 return $artlist;:返回最终的HTML列表。
- 打开
-
在模板中使用标签
- 假设我们要获取ID为
2的分类下的5篇文章,标题长度为20个字符。<h2>最新文章</h2> <ul> {dede:myarclist typeid='2' row='5' titlelen='20'} {/dede:myarclist} </ul>
- 假设我们要获取ID为
-
生成并查看效果
- 生成页面后,模板中的
{dede:myarclist...}部分会被替换成一个包含5篇文章列表的<ul>
- 生成页面后,模板中的
第四步:制作一个更复杂的SQL查询标签(高级级)
这个例子将展示如何使用更复杂的SQL和织梦的其他功能。
场景:获取指定时间范围内的热门文章(按点击量排序)
步骤详解:
-
创建标签处理文件
- 在
/include/taglib/目录下,新建一个名为hotbytime.lib.php的文件。
- 在
-
编写PHP代码
- 打开
hotbytime.lib.php文件,输入以下代码:
<?php if (!defined('DEDEINC')) { exit('Request Error!'); } function lib_hotbytime(&$ctag, &$refObj) { // 定义属性:开始日期、结束日期、显示数量 $attlist = 'startdate|0,enddate|0,row|10'; $atts = DedeAttributeParse($ctag->GetAtt(), $attlist); $startdate = $atts['startdate']; $enddate = $atts['enddate']; $row = $atts['row']; // 构建SQL,注意日期格式的处理 $where = " WHERE 1=1 "; if (!empty($startdate)) { $where .= " AND pubdate >= '".GetMkTime($startdate)."'"; } if (!empty($enddate)) { $where .= " AND pubdate <= '".GetMkTime($enddate)."'"; } $sql = "SELECT id, title, click FROM dede_archives {$where} ORDER BY click DESC LIMIT 0, {$row}"; $dsql = new DedeSql(false); $dsql->SetQuery($sql); $dsql->Execute('me'); $hotlist = ''; while ($row = $dsql->GetArray('me')) { $hotlist .= "<li><a href='/view.php?aid={$row['id']}'>{$row['title']}</a> (点击:{$row['click']})</li>\n"; } $dsql->Close(); return $hotlist; } ?>- 代码解析:
GetMkTime($startdate):织梦内置函数,将YYYY-MM-DD格式的字符串转换成Unix时间戳,用于SQL查询。$where条件拼接:根据是否传入了开始和结束日期,动态构建SQL的WHERE子句。ORDER BY click DESC:按点击量降序排序,实现“热门”效果。
- 打开
-
在模板中使用标签
- 获取2025年1月1日到2025年1月31日的热门文章,显示10条。
<h2>本月热门文章</h2> <ul> {dede:hotbytime startdate='2025-01-01' enddate='2025-01-31' row='10'} {/dede:hotbytime} </ul>
- 获取2025年1月1日到2025年1月31日的热门文章,显示10条。
第五步:标签的调用与管理
在模板中如何调用
- 对标签:
{dede:mytag /} - 对标签:标签体内容通常作为默认内容,当标签返回空时显示。
{dede:myarclist typeid='2'} 暂无文章 {/dede:myarclist}
如何管理和查看已添加的标签
织梦后台提供了一个“自定义标签”管理界面,方便你查看和管理。
- 登录织梦后台。
- 在左侧菜单中找到 “核心” -> “自定义标签”。
- 你可以看到所有系统内置的标签和你自己创建的标签。
- 你可以在这里测试标签的输出,查看标签的参数说明,这对于调试非常有用。
第六步:常见问题与注意事项
- 文件名和函数名必须匹配:
mytag.lib.php文件对应的函数名必须是lib_mytag,大小写也要注意。 - 安全第一:永远不要直接将用户输入的参数拼接到SQL中,除非你做了严格的过滤或使用了参数化查询,上面的例子中,
typeid是管理员在模板中设定的,相对安全,如果接受用户输入,请务必使用$dsql->SetQuery("SELECT ... WHERE field = '{$value}'");这种方式让织梦的数据库类进行简单处理,或者更推荐使用$dsql->Execute('me', "SELECT ... WHERE field = ?", array($value));。 - 性能问题:避免在自定义标签中进行非常耗时的数据库查询或循环操作,标签会被频繁调用,性能差的标签会严重影响网站速度。
- 缓存问题:织梦有页面缓存机制,如果你的自定义标签数据需要实时更新,记得在生成页面时勾选“不生成静态HTML”或者使用“动态浏览”模式。
- 调试技巧:如果标签没有输出,最简单的调试方法是在函数中
echo "test"; exit;,看看页面是否能输出 "test",如果能,说明函数被调用了,问题出在返回值上,如果连 "test" 都没有,说明函数根本没有被调用,检查文件名和函数名。
通过以上步骤,你就可以在织梦CMS中自由地创建和使用自定义标签了,这将让你的模板开发能力得到质的飞跃。
