在 DedeCMS 中,"全局标签"通常指的是那些可以在网站任何地方(包括首页、列表页、内容页、单页甚至外部文件)通过 {dede:标签名} 形式调用的标签,自定义这类标签,主要指的是创建一个自定义的函数,并将其注册到 DedeCMS 的标签解析系统中,使其能够像系统自带的标签一样被调用。

这个过程主要分为两大类:
- 创建简单的、纯 PHP 代码的标签:适用于直接执行一些 PHP 逻辑并返回结果的场景。
- 创建复杂的、带模板的标签:适用于需要循环输出数据,并且需要一套独立的 HTML 模板来渲染结果的场景(类似
{dede:arclist})。
下面我们以 DedeCMS 5.x / 7.x 版本为例,详细讲解这两种方法。
准备工作:找到核心文件
在进行任何修改之前,请务必备份你的网站文件!
你需要修改的核心文件通常位于 /include/ 目录下:
inc_fun_funAdmin.php:用于注册和存放简单标签的函数。taglib目录:/include/taglib/,这里存放的是复杂标签的解析类文件。
创建简单的全局标签(纯 PHP 函数)
这种方法适用于那些不需要循环、不需要模板、直接返回一个字符串或变量的标签。

示例:创建一个 {dede:hello_world/} 标签,输出 "Hello, DedeCMS!"
第一步:编写 PHP 函数
-
打开文件
/include/inc_fun_funAdmin.php。 -
在文件末尾,添加以下 PHP 函数:
/** * 自定义全局标签:hello_world * 返回一个固定的字符串 * * @return string */ if (!function_exists('HelloWorld')) { function HelloWorld() { return "Hello, DedeCMS! This is a custom tag."; } }函数命名规则:
(图片来源网络,侵删)- 函数名必须以大写字母开头(
HelloWorld),因为在 DedeCMS 内部,标签名会被首字母大写来寻找对应的函数。 - 函数名不能与已有函数重名。
- 函数名必须以大写字母开头(
第二步:注册标签
DedeCMS 的标签解析器会自动在 inc_fun_funAdmin.php 文件中寻找以大写字母开头的函数,并将其注册为标签,只要你按照上面的规则命名函数,这一步是自动完成的,无需额外操作。
第三步:使用标签
你可以在网站的任何模板文件(.htm)中使用这个标签了。
<!DOCTYPE html>
<html>
<head>自定义标签测试</title>
</head>
<body>
<h1>欢迎使用 DedeCMS</h1>
<p>下面是调用自定义标签的结果:</p>
<p>{dede:hello_world/}</p>
</body>
</html>
第四步:更新缓存并测试
- 登录 DedeCMS 后台。
- 点击顶部菜单的“生成” -> “更新主页HTML” 或 “更新系统缓存”。
- 刷新你的前台页面,你应该就能看到 "Hello, DedeCMS! This is a custom tag." 这段文字了。
创建带模板的复杂全局标签(类库方式)
这种方法功能更强大,类似于系统自带的 {dede:arclist}、{dede:channelartlist} 等标签,它需要一个 PHP 类来处理逻辑,并且需要一个独立的 HTML 模板文件来渲染输出。
示例:创建一个 {dede:mylist limit='5'} 标签,用于调用指定栏目下的最新文章列表。
第一步:创建标签解析类文件
-
在
/include/taglib/目录下,创建一个新的 PHP 文件,命名为mylist.lib.php。- 文件名规则:
标签名.lib.php,这里标签名是mylist,所以文件名就是mylist.lib.php。
- 文件名规则:
-
在
mylist.lib.php文件中,编写如下代码:<?php if(!defined('DEDEINC')) exit('Request Error!'); /** * 自定义复杂标签:mylist * 功能:调用指定栏目的最新文章列表 */ class mylist { // 属性,用于存放标签的属性,如 limit, typeid 等 var $dsql; var $PlusModel; // 构造函数 function __construct() { global $dsql; $this->dsql = $dsql; } // 核心解析函数,必须命名为 function GetList($ctp, $refObj) { // 1. 获取标签属性 $typeid = $this->CTags->GetAtt('typeid'); // 获取 typeid 属性 $limit = $this->CTags->GetAtt('limit'); // 获取 limit 属性,默认为 10 if(empty($limit)) $limit = 10; // 2. 查询数据库 // 注意:这里只是示例,实际应用中需要更严谨的SQL和安全检查 $innertext = $this->CTags->GetInnerText(); // 获取标签内的内容(模板) $artlist = ''; // 执行查询 $query = "SELECT id, title, pubdate FROM `#@__archives` WHERE typeid = '$typeid' ORDER BY id DESC LIMIT 0, $limit"; $dsql->SetQuery($query); $dsql->Execute(); // 3. 循环处理数据并填充模板 while($row = $dsql->GetArray()) { // 处理日期格式 $pubdate = MyDate('Y-m-d H:i:s', $row['pubdate']); // 使用 $ctp->Assign() 来替换模板中的变量 // 模板中的变量名由这里决定,如 [field:title] $ctp->Assign('fields', array( 'title' => $row['title'], 'pubdate' => $pubdate, 'arcurl' => GetFileUrl($row['id']) // 获取文章链接 )); // 调用Parse()方法解析内模板,并将结果追加到 $artlist $artlist .= $ctp->GetResult(); } // 4. 返回最终结果 return $artlist; } } ?>
代码解释:
class mylist:类名必须和标签名、文件名保持一致(不区分大小写,但建议保持一致)。GetList($ctp, $refObj):这是复杂标签的核心解析函数,名称必须是GetList。$this->CTags->GetAtt('属性名'):用于获取标签的属性值,如{dede:mylist typeid='2' limit='5'}中的typeid和limit。$this->CTags->GetInnerText():获取标签对之间的内容,也就是你的HTML模板。$ctp->Assign('fields', array(...)):将数据库查询到的数据赋值给模板变量。'fields'是一个固定的前缀,模板中的变量通过[field:变量名]来调用。$ctp->GetResult():解析$innertext中的模板,并将已赋值的变量替换进去。
第二步:在模板中使用标签
现在你可以在模板中这样使用它:
<h2>最新文章列表(来自自定义标签)</h2>
<ul>
{dede:mylist typeid='2' limit='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span class="date">发布时间:[field:pubdate/]</span>
</li>
{/dede:mylist}
</ul>
typeid='2':指定调用栏目ID为2下的文章。limit='5':限制调用5条。<li>...</li>之间的所有内容就是$innertext,也就是你的模板。[field:arcurl/]、[field:title/]、[field:pubdate/]就是在 PHP 类中$ctp->Assign赋值的变量。
第三步:更新缓存并测试
- 登录 DedeCMS 后台。
- 点击“生成” -> “更新系统缓存”。
- 刷新前台页面,你应该就能看到栏目ID为2的最新5篇文章列表了。
总结与注意事项
| 特性 | 简单标签 (方法一) | 复杂标签 (方法二) |
|---|---|---|
| 适用场景 | 返回单个值、简单计算、直接输出HTML片段 | 循环输出数据、需要独立模板渲染 |
| 核心文件 | /include/inc_fun_funAdmin.php |
/include/taglib/标签名.lib.php |
| 实现方式 | 编写一个独立的 PHP 函数 | 编写一个包含 GetList 方法的 PHP 类 |
| 模板 | 无,直接在调用位置输出结果 | 标签对 {dede:标签名}...模板...{/dede:标签名} 之间的内容 |
| 灵活性 | 较低 | 非常高,可以处理复杂逻辑和数据库交互 |
| 变量调用 | 不适用 | 通过 [field:变量名/] 调用 |
重要提示:
- 安全第一:在方法二中,直接拼接 SQL 语句(如
$query = "SELECT ... WHERE typeid = '$typeid'")存在巨大的 SQL 注入风险。在实际项目中,务必使用 DedeCMS 提供的安全查询方法,$dsql->SelectSql()或预处理语句。 - 性能考虑:自定义标签会执行 PHP 代码和数据库查询,请确保代码效率,避免在首页等高频率访问的页面使用过于复杂的标签。
- 缓存:修改标签后,一定要在后台更新系统缓存,否则前台可能看不到效果。
- 版本差异:DedeCMS 不同版本(如 5.7, 5.8, 7.x)在底层实现上可能略有差异,但核心原理基本一致,如果遇到问题,可以查阅对应版本的官方文档或社区。
通过以上两种方法,你就可以根据自己的需求,灵活地扩展 DedeCMS 的功能,打造出更符合网站需求的个性化标签。
