tags.php 是 DedeCMS 中用于标签聚合页的模板文件,当用户点击网站上的一个标签(tag)时,系统会调用这个模板,展示所有与该标签相关的文章列表。

模板文件位置
tags.php 模板文件通常位于你当前使用主题的目录下。
路径: /你的网站目录/templets/你的默认模板名称/tags.php
如果你的模板文件夹是 default,那么路径就是 /templets/default/tags.php。
重要提示: 如果你的 templets/你的默认模板名称/ 目录下没有 tags.php 文件,DedeCMS 会自动调用系统默认的模板,通常位于 /dede/templets/tags_default.htm,为了自定义标签页样式,你最好自己创建一个 tags.php 文件。

模板基本结构
一个完整的 tags.php 模板通常包含以下几个部分:
- 头部信息
- 区
- 分页导航
- 底部信息
下面是一个最基础、最常用的 tags.php 模板代码示例,并附有详细注释。
<?php
/**
* 标签聚合页模板
* 文件名: tags.php
*/
require_once(dirname(__FILE__)."/../include/common.inc.php");
// --- 获取当前标签名称 ---
$tag = isset($tag) ? trim($tag) : '';
if ($tag == '') {
showMsg('请指定标签名称', '-1');
exit();
}
// --- 调用标签,获取相关文章列表 ---
// 这部分是核心,通过 {dede:tag} 标签来获取数据
$pagesize = 20; // 每页显示的文章数量
$dlist = new DataListCP();
$dlist->pageSize = $pagesize;
$dlist->SetTemplate($cfg_basedir . $cfg_templets_dir . "/" . $cfg_defaultstyle . "/article_list.htm"); // 指定文章列表的样式模板
// 设置SQL查询条件,查找包含当前标签的所有文档
$dlist->SetSource("SELECT a.*,t.typename FROM `dede_archives` a
LEFT JOIN `dede_arctype` t ON a.typeid=t.id
WHERE a.id IN (SELECT aid FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}')
ORDER BY a.id DESC");
// 执行查询并显示数据
$dlist->Display();
?>
核心代码解析
上面的代码可能对初学者有些复杂,我们来分解一下。
引入公共文件
require_once(dirname(__FILE__)."/../include/common.inc.php");
这是 DedeCMS 所有 PHP 页面的标准开头,用于加载系统核心函数、数据库连接、配置信息等。必不可少。
获取当前标签名
$tag = isset($tag) ? trim($tag) : '';
if ($tag == '') {
showMsg('请指定标签名称', '-1');
exit();
}
isset($tag): 检查 URL 中是否存在tag参数,标签页的访问URL通常是tags.php?tag=标签名。trim($tag): 去掉标签名前后的空格。- 如果没有获取到标签名,则提示错误并退出。
核心查询逻辑(最关键的部分)
$dlist->SetSource("SELECT a.*,t.typename FROM `dede_archives` a
LEFT JOIN `dede_arctype` t ON a.typeid=t.id
WHERE a.id IN (SELECT aid FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}')
ORDER BY a.id DESC");
这行 SQL 语句是标签页工作的核心,它的意思是:
- 从
dede_archives(文章主表) 和dede_arctype(栏目表) 中选择数据。a.*代表文章的所有字段,t.typename代表文章所属的栏目名称。 - 关联条件:
a.typeid=t.id,即通过文章的typeid找到对应的栏目。 - 筛选条件 (WHERE): 这是关键,它使用
IN子句,只选择那些 ID 出现在dede_taglist表中的文章。dede_taglist表记录了文章 (aid) 和标签 (tag) 的对应关系。WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}'这个复杂的条件是为了精确匹配,因为一个文章可以有多个标签,标签之间用空格隔开("php 教程 cms"),这个条件可以确保既能匹配到独立的标签,也能匹配到作为词语一部分的标签,避免错误匹配,搜索 "php" 不会匹配到 "phpcms"。
- 排序:
ORDER BY a.id DESC按文章 ID 降序排列,即最新的文章排在最前面。
使用 DataListCP 类进行分页
$dlist = new DataListCP(); $dlist->pageSize = 20; // 设置每页显示数量 $dlist->SetTemplate($cfg_basedir . $cfg_templets_dir . "/" . $cfg_defaultstyle . "/article_list.htm"); // 指定列表模板 $dlist->SetSource(...); // 设置上面写的SQL $dlist->Display(); // 执行查询并显示列表和分页
DataListCP是 DedeCMS 内置的一个用于处理数据列表和分页的类。SetTemplate(): 非常重要,这个方法指定了用来渲染文章列表的模板文件,这个模板文件通常是列表页模板,article_list.htm,这意味着你的tags.php的主要工作就是准备数据,而真正的 HTML 结构由article_list.htm来完成,这样做的好处是,标签列表页和栏目列表页可以共用同一个列表模板,保持风格统一。Display(): 这个方法会自动执行 SQL 查询,获取当前页的数据,加载SetTemplate()指定的模板文件,并将数据填充进去,最后输出 HTML,同时自动生成分页导航。
简化的模板写法(推荐新手)
如果你觉得上面的 DataListCP 方式比较复杂,DedeCMS 也提供了一种更简单、类似模板标签的写法,更符合织梦的“模板引擎”思想。
下面是一个简化版的 tags.php:
<?php
/**
* 简化版标签聚合页模板
*/
require_once(dirname(__FILE__)."/../include/common.inc.php");
$tag = isset($tag) ? trim($tag) : '';
if ($tag == '') {
showMsg('请指定标签名称', '-1');
exit();
}
// 设置一些变量,供下面的模板标签使用
$GLOBALS['tag'] = $tag;
$GLOBALS['pagesize'] = 20;
// 调用系统内置的标签处理函数,获取分页数据
$pagenow = (isset($PageNo) && is_numeric($PageNo)) ? $PageNo : 1;
$startRecord = ($pagenow - 1) * $GLOBALS['pagesize'];
// 获取总记录数,用于分页
$row = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}'");
$totalRecord = $row['dd'];
// 获取当前页的文章列表
$dsql->SetQuery("SELECT a.*,t.typename FROM `dede_archives` a
LEFT JOIN `dede_arctype` t ON a.typeid=t.id
WHERE a.id IN (SELECT aid FROM `dede_taglist` WHERE tag like '{$tag} %' OR tag like '% {$tag}' OR tag like '% {$tag} %' OR tag = '{$tag}')
ORDER BY a.id DESC
LIMIT {$startRecord}, {$GLOBALS['pagesize']}");
$dsql->Execute();
$GLOBALS['arts'] = array();
while ($row = $dsql->GetArray()) {
$GLOBALS['arts'][] = $row;
}
// 加载并显示模板
include(DEDETEMPLATE.'/default/article_list.htm'); // 请确保路径正确
?>
这个简化版的 tags.php 直接通过 PHP 代码获取数据,并将数据存入全局变量(如 $GLOBALS['arts']),然后直接引入一个列表模板(如 article_list.htm)来显示,在 article_list.htm 中,你就可以像正常列表页一样使用 {dede:list} 或 {dede:arclist} 标签来循环输出文章。
最佳实践建议
- 创建独立的
tags.php:不要直接修改系统核心文件,始终在你的主题目录下创建tags.php。 - 复用列表模板:强烈推荐使用
DataListCP的方式,让tags.php复用你已有的article_list.htm(列表页模板),这样能保证全站列表风格的一致性,也更容易维护。 - 优化 SQL:如果你的网站文章非常多,标签也很多,
dede_taglist表可能会很大,可以考虑为tag字段添加索引,以提高查询速度。 - 美化页面:
tags.php模板只负责数据逻辑,页面的美化(如添加当前标签的标题、描述等)需要在对应的列表模板(如article_list.htm)中完成,你可以在article_list.htm的开头通过{dede:global name='tag'/}来获取并显示当前标签名。
希望这份详细的解析能帮助你完全理解和使用 DedeCMS 的 tags.php 模板!
