文件位置
tags.php 文件通常位于 DedeCMS 网站的根目录下,与 index.php、list.php、article_detail.php 等文件并列。

/your_dede_cms_root/
├── tags.php <-- 我们要分析的核心文件
├── index.php
├── list.php
├── ...
└── /include/
└── ...
核心功能与作用
tags.php 的主要作用是作为一个前端入口和路由分发器,当用户访问一个标签相关的 URL 时(http://yourdomain.com/tags.php/标签名称/),服务器会首先执行 tags.php 脚本。
它的核心任务可以分解为以下几点:
- 接收请求参数:从 URL 中解析出需要操作的标签名称、页码等信息。
- 加载必要环境:初始化 DedeCMS 的核心配置、数据库连接、全局函数等。
- 调用逻辑处理:根据请求参数,调用
include目录下相应的类或函数来处理业务逻辑(如查询数据库、获取相关文章等)。 - 渲染并输出模板:将处理好的数据加载到指定的模板文件中,并最终生成 HTML 页面返回给用户的浏览器。
代码结构与解析 (以较新版本为例)
下面我们一步步解析 tags.php 的典型代码结构。
a) 初始化和参数获取
文件的开头部分,首先是 require_once 引入核心的 common.inc.php 文件,这个文件是 DedeCMS 的“心脏”,负责加载所有必需的全局变量、常量、函数和数据库连接。

// 引入公共初始化文件 require_once (dirname(__FILE__) . "/include/common.inc.php");
紧接着,它从 GET 请求中获取 tag 参数,这个参数通常就是 URL 中的标签名称。
// 从GET请求中获取标签名 $tag = isset($tag) && trim($tag) != '' ? trim($tag) : '';
b) 获取标签信息 (Tpls)
DedeCMS 的标签系统支持为每个标签指定一个专门的模板文件,这个配置存储在 #@__tagindex (标签索引表) 和 #@__taglist (标签列表表) 中,代码会首先查询这些表,获取与当前标签相关的信息,包括:
- ID:标签的唯一ID。
- tagname:标签名称。
- count:该标签下的文章数量。
- typeid:该标签关联的栏目ID。
- **templist **:标签列表页的模板文件名。
- **temparticle **:标签内容页(即点击标签后进入的页面)的模板文件名。
// 如果没有提供标签名,则列出所有热门标签
if ($tag == '') {
// ... 逻辑代码,通常是跳转到标签云页面 ...
// include(DEDETEMPLATE.'/taglist.htm');
// exit();
}
// 查询标签信息,从 #@__tagindex 表中获取
$row = $dsql->GetOne("SELECT * FROM `#@__tagindex` WHERE tagname like '{$tag}' ");
if (!is_array($row)) {
// 如果标签不存在,则提示错误或跳转到404页面
// ... 通常会包含一个404模板 ...
// include(DEDETEMPLATE.'/404.htm');
// exit();
}
// 获取标签列表页的模板
$templist = $row['templist'] ? $row['templist'] : 'taglist_default.htm';
// 获取标签内容页的模板
$templet = $row['temparticle'] ? $row['temparticle'] : 'tagarticle_default.htm';
c) 调用核心处理类
获取了模板信息后,tags.php 会根据 URL 的结构决定是显示标签列表还是标签内容页,这通常通过检查 URL 中是否包含 来判断。
tags.php/标签名称/:显示该标签下的所有文章列表。tags.php/标签名称/数字/:显示该标签文章列表的某一页。tags.php/标签名称/文章ID.html:显示某篇具体的文章详情页(此功能在新版本中较少见,通常由article_detail.php处理)。
显示标签列表页

这是最常见的用法,代码会调用 ArcTag.class.php 类中的方法来获取数据。
// 如果URL中没有 / 或 / 后面不是数字,则认为是标签列表页
if (empty($PageNo)) {
// 引入标签处理类
require_once(DEDEINC.'/arc.tag.class.php');
// 实例化标签类
// $dsql 是已连接的数据库对象
// $row 是上一步查询到的标签信息
$tagArr = $dsql->GetOne("SELECT * FROM `#@__taglist` WHERE tagid = '{$row['id']}'");
$arcTag = new ArcTag($dsql, $tag['tagname'], $tagArr['typeid'], $tagArr['totalnum'], $tagArr['crossid'], $tagArr['pagecount']);
// 获取分页链接
$pagenow = (isset($PageNo) && is_numeric($PageNo)) ? $PageNo : 1;
$list = $arcTag->GetList($pagenow, $row['pagesize']);
// 将获取到的数据赋值给模板引擎
$GLOBALS['envs']['tags'] = $tag;
$GLOBALS['envs']['list'] = $list;
$GLOBALS['envs']['pagestyle'] = $tagArr['pagestyle'];
// 加载并解析模板
$tplfile = DEDETEMPLATE . '/' . $templist;
$dtp = new DedeTemplate();
$dtp->LoadTemplate($tplfile);
$dtp->Display();
exit();
}
显示标签内容页(单篇文章)
这种情况下,URL 类似 tags.php/标签名称/文章ID.html,代码会根据文章ID获取文章内容,并加载 temparticle 指定的模板。
// else 部分处理单篇文章详情 // ... // 逻辑通常是: // 1. 根据 tag 和 aid 获取文章信息 // 2. 加载 'temparticle' 指定的模板 // 3. 解析模板并输出 // ...
模板文件
tags.php 的最终显示效果由其对应的模板文件决定,主要有两个模板:
-
标签列表页模板 (
taglist.htm或自定义名)- 位置:
/templets/default/目录下,或你在后台指定的模板目录。 - 用途:当用户点击一个标签时,显示该标签下所有文章的列表。
- 常用标签:
{dede:field.title/}:标签页的标题。{dede:field.body/}:标签的描述(如果有的话)。{dede:list pagesize='20'}:循环输出该标签下的文章列表,pagesize控制每页显示数量。{dede:field.title/}:列表中的文章标题。{dede:field.pubdate function="MyDate('Y-m-d',@me)"/}:文章发布日期。{dede:field.arcclick/}:文章点击量。{dede:pagelist listsize='4' listitem='info,index,next,end,pre'/}:分页条。
- 位置:
-
页模板 (
tagarticle.htm或自定义名)- 位置:同上。
- 用途:显示单篇文章的完整内容。
- 常用标签:与文章详情页 (
article_article.htm) 类似,如{dede:field.title/},{dede:field.body/},{dede:field.keywords/}等。
常见问题与修改建议
-
标签页不更新/显示错误
- 原因:DedeCMS 的标签系统需要手动更新,如果你在后台添加了新文章但没有将其关联到标签,或者修改了标签模板,缓存可能导致页面不更新。
- 解决方案:
- 登录 DedeCMS 后台,进入“标签管理” -> “更新标签缓存”。
- 检查对应标签的
templist和temparticle字段是否正确填写了模板文件名。 - 清理网站缓存。
-
想修改标签列表页的样式
- 方法:不要直接修改
tags.php,直接去/templets/your_template/目录下找到taglist.htm文件,用 Dreamweaver 等工具修改其 HTML 和 CSS 代码即可。
- 方法:不要直接修改
-
想修改标签页每页显示的文章数量
- 方法:
- 方法一(推荐):修改模板文件
taglist.htm中的{dede:list}标签,例如改为{dede:list pagesize='50'}。 - 方法二:在后台“标签管理”中编辑该标签,可以设置一个默认的“每页显示数”,这个值会覆盖模板中的
pagesize。
- 方法一(推荐):修改模板文件
- 方法:
tags.php 是 DedeCMS 标签功能的大脑,它本身并不包含复杂的业务逻辑,而是像一个调度员,负责接收请求、加载环境、调用核心类(如 ArcTag.class.php)并渲染模板,理解了它的运作方式,你就能轻松地自定义标签页的样式、功能和表现。
