核心思路: 这个修改主要涉及两个步骤:

- 获取拼音:当用户添加或修改一个 tag 时,我们需要将其中文关键词转换成对应的拼音,并存储到数据库的
tag表中。 - 重写路径:修改
tags.php文件,使其不再使用tag变量来查询,而是使用一个表示拼音的变量(pinyin),然后根据这个拼音去数据库中查找对应的中文 tag。
详细操作步骤
第一步:为 tag 表添加一个拼音字段
我们需要一个地方来存储每个 tag 对应的拼音,最直接的方法就是给 dede_tagindex 和 dede_taglist 这两张表都增加一个字段。
-
登录你的网站数据库管理工具(如 phpMyAdmin)。
-
选择你的 DedeCMS 数据库。
-
执行以下两条 SQL 语句,分别为
dede_tagindex和dede_taglist表添加一个pinyin字段(类型为varchar(250),长度足够长):
(图片来源网络,侵删)ALTER TABLE `dede_tagindex` ADD `pinyin` VARCHAR(250) NOT NULL DEFAULT ''; ALTER TABLE `dede_taglist` ADD `pinyin` VARCHAR(250) NOT NULL DEFAULT '';
第二步:修改内核文件,在保存 tag 时自动生成并保存拼音
我们需要修改处理 tag 数据的文件,让它自动将中文转换成拼音并存入新字段,这个文件是 /include/helpers/archive.helper.php。
-
打开
/include/helpers/archive.helper.php文件。 -
找到
InsertTags()函数(大约在 385 行左右)。 -
在这个函数中,找到执行数据库插入操作的代码段,它看起来类似这样:
(图片来源网络,侵删)// ... 其他代码 ... $inquery = "INSERT INTO `dede_tagindex`(tag,typename,weekcount,monthcount,totalcount,addtime) VALUES ('$tag','$typeid','$weekcount','$monthcount','$totalcount','$addtime'); "; $dsql->ExecuteNoneQuery($inquery); $id = $dsql->GetLastID(); $inquery2 = "INSERT INTO `dede_taglist`(tagid,aid,tag,typename,addtime) VALUES ('$id','$aid','$tag','$typeid','$addtime'); "; $dsql->ExecuteNoneQuery($inquery2); // ... 其他代码 ... -
在执行插入操作之前,我们需要先获取拼音,在
$inquery这行代码之前,添加以下代码:// 引入拼音转换类(如果还没有引入的话) // DedeCMS 自带或可以下载一个拼音类,这里假设我们有一个 pinyin.class.php // 如果没有,你可以从网上搜索 "php 汉字转拼音类" 并将其放在 /include/ 目录下 require_once(DEDEINC.'/pinyin.class.php'); // 请确保这个文件存在并可用 // 实例化拼音类 $pinyin = new ChinesePinyin(); // 将 tag 转换为小写拼音,并去除特殊字符 $tag_pinyin = strtolower($pinyin->Transform($tag, ' ')); $tag_pinyin = preg_replace("/[^a-z0-9-]/", "", $tag_pinyin); // 只保留字母、数字和连字符注意:你需要一个
ChinesePinyin类,DedeCMS 可能没有内置一个完美的,你可以从网上找一个可靠的,你可以下载一个pinyin.class.php文件,然后放在/include/目录下,然后修改require_once的路径。 -
修改
$inquery和$inquery2SQL 语句,将$tag_pinyin添加进去:// 修改前 // $inquery = "INSERT INTO `dede_tagindex`(tag,typename,weekcount,monthcount,totalcount,addtime) VALUES ('$tag','$typeid','$weekcount','$monthcount','$totalcount','$addtime'); "; // 修改后 $inquery = "INSERT INTO `dede_tagindex`(tag, pinyin, typename,weekcount,monthcount,totalcount,addtime) VALUES ('$tag', '$tag_pinyin', '$typeid','$weekcount','$monthcount','$totalcount','$addtime'); "; $dsql->ExecuteNoneQuery($inquery); $id = $dsql->GetLastID(); // 修改前 // $inquery2 = "INSERT INTO `dede_taglist`(tagid,aid,tag,typename,addtime) VALUES ('$id','$aid','$tag','$typeid','$addtime'); "; // 修改后 $inquery2 = "INSERT INTO `dede_taglist`(tagid,aid,tag,pinyin,typename,addtime) VALUES ('$id','$aid','$tag','$tag_pinyin','$typeid','$addtime'); "; $dsql->ExecuteNoneQuery($inquery2);
完成这一步后,当你再去后台发布文章或修改文章标签时,新标签的拼音就会被自动保存到数据库中。
第三步:修改 tags.php 以支持拼音路径
这是最关键的一步,我们需要让 tags.php 能够识别 /tags/pinyin/ 这样的路径,并正确解析。
-
打开根目录下的
tags.php文件。 -
找到获取 tag 参数的核心代码,通常是在文件的开头部分,类似这样:
// ... if(!empty($tag)) { $tag = FilterSearch(urldecode($tag)); $cquery = "SELECT * FROM `dede_tagindex` WHERE tag like '%$tag%' "; $nextRow = $dsql->GetOne($cquery); // ... } // ... -
替换整个文件的内容,为了更清晰地实现 URL 重写和查询逻辑,我们可以重写这个文件,将
tags.php的所有内容替换为以下代码:<?php /** * DedeCMS Tag拼音路径支持 * 将原 tags.php 文件内容替换为以下代码 */ require_once(dirname(__FILE__)."/include/common.inc.php"); require_once(DEDEINC."/arc.taglist.class.php"); // 获取 URL 中的拼音参数 // 对于 /tags/phpjiqiao/,$_SERVER['PATH_INFO'] 会是 /phpjiqiao/ $pinyin = trim($_SERVER['PATH_INFO'], '/'); // 如果没有获取到拼音,或者直接访问 tags.php,则显示所有标签 if (empty($pinyin)) { // 显示所有标签的逻辑(可选,保持原样或跳转) // 这里我们让它跳转到首页或显示一个提示 header("Location: /"); exit(); } // 根据拼音查找对应的中文标签 $row = $dsql->GetOne("SELECT tag FROM `dede_tagindex` WHERE pinyin = '$pinyin' "); // 如果找不到对应的标签,则显示404或跳转 if (!is_array($row)) { // 可以自定义404页面 // header("HTTP/1.1 404 Not Found"); // require_once(DEDETEMPLATE.'/error.htm'); // exit(); header("Location: /"); exit(); } // 获取到真实的中文标签 $tag = $row['tag']; // --- 以下代码基本是原 tags.php 的逻辑,只是将 $tag 变量替换为我们查询出来的值 --- $typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0; if ($typeid > 0) { $cquery = "SELECT * FROM `dede_arctype` WHERE id='$typeid' AND ishidden<>1 "; $typeRow = $dsql->GetOne($cquery); if (is_array($typeRow)) { $typeinfos = $typeRow; } } $tags = ''; if ($tag != '') { $tags = FilterSearch(urldecode($tag)); $tagbody = stripslashes($tag); } $PageNo = 1; $PageSize = 20; $addtable = ''; if ($tag != '') { $tpl = $cfg_basedir . $cfg_templets_dir . "/" . $cfg_df_style . "/taglist.htm"; if (!file_exists($tpl)) { $tpl = $cfg_basedir . $cfg_templets_dir . "/default/taglist.htm"; } $dlist = new TagList($tag, $typeid); $dlist->SetTemplet($tpl); $dlist->Display(); } else { include(DEDETEMPLATE.'/default/tag.htm'); } ?>
第四步:配置伪静态(Rewrite)
为了让 /tags/phpjiqiao/ 这样的路径正常工作,而不是触发 404,你需要配置服务器的伪静态规则。
Nginx 伪静态规则
在 Nginx 的配置文件中(通常是 nginx.conf 或站点配置文件),添加以下规则:
location /tags {
rewrite "^/tags/([^\.]*)(?:\.html)?(/?)(.*)$" /tags.php/$1 last;
}
Apache 伪静态规则
-
确保你的网站开启了
mod_rewrite模块。 -
在网站根目录下创建或修改
.htaccess文件,添加以下规则:<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^tags/(.*)$ /tags.php/$1 [L] </IfModule>
重要提醒:修改伪静态配置后,需要重启 Nginx/Apache 服务才能生效。
完成以上四个步骤后,你的 DedeCMS tag 路径就会成功修改为拼音格式了。
- 数据库:为
tag表增加了pinyin字段。 - 内核:修改了
archive.helper.php,在保存标签时自动生成并存储拼音。 - 入口文件:重写了
tags.php,使其能够识别拼音参数并查询对应的中文标签。 - 服务器配置:配置了伪静态规则,使拼音 URL 能够被正确解析。
注意事项:
- 拼音类文件:
pinyin.class.php的质量直接影响拼音转换的准确性,请选择一个可靠的版本。 - 历史数据:这个修改只对新添加的 tag 生效,你之前创建的 tag 数据库中没有拼音,访问它们的拼音路径会 404,你需要手动更新旧数据,或者写一个简单的脚本来批量为旧 tag 生成拼音并更新数据库。
- 备份:在修改任何核心文件(如
archive.helper.php)和数据库结构之前,务必备份!
