dede tag路径如何改为拼音?

99ANYc3cd6
预计阅读时长 24 分钟
位置: 首页 DEDE建站 正文

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

如何修改dede的tag路径改为拼音
(图片来源网络,侵删)
  1. 获取拼音:当用户添加或修改一个 tag 时,我们需要将其中文关键词转换成对应的拼音,并存储到数据库的 tag 表中。
  2. 重写路径:修改 tags.php 文件,使其不再使用 tag 变量来查询,而是使用一个表示拼音的变量(pinyin),然后根据这个拼音去数据库中查找对应的中文 tag。

详细操作步骤

第一步:为 tag 表添加一个拼音字段

我们需要一个地方来存储每个 tag 对应的拼音,最直接的方法就是给 dede_tagindexdede_taglist 这两张表都增加一个字段。

  1. 登录你的网站数据库管理工具(如 phpMyAdmin)。

  2. 选择你的 DedeCMS 数据库。

  3. 执行以下两条 SQL 语句,分别为 dede_tagindexdede_taglist 表添加一个 pinyin 字段(类型为 varchar(250),长度足够长):

    如何修改dede的tag路径改为拼音
    (图片来源网络,侵删)
    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

  1. 打开 /include/helpers/archive.helper.php 文件。

  2. 找到 InsertTags() 函数(大约在 385 行左右)。

  3. 在这个函数中,找到执行数据库插入操作的代码段,它看起来类似这样:

    如何修改dede的tag路径改为拼音
    (图片来源网络,侵删)
    // ... 其他代码 ...
    $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);
    // ... 其他代码 ...
  4. 在执行插入操作之前,我们需要先获取拼音,在 $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 的路径。

  5. 修改 $inquery$inquery2 SQL 语句,将 $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/ 这样的路径,并正确解析。

  1. 打开根目录下的 tags.php 文件。

  2. 找到获取 tag 参数的核心代码,通常是在文件的开头部分,类似这样:

    // ...
    if(!empty($tag))
    {
        $tag = FilterSearch(urldecode($tag));
        $cquery = "SELECT * FROM `dede_tagindex` WHERE tag like '%$tag%' ";
        $nextRow = $dsql->GetOne($cquery);
        // ...
    }
    // ...
  3. 替换整个文件的内容,为了更清晰地实现 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 伪静态规则

  1. 确保你的网站开启了 mod_rewrite 模块。

  2. 在网站根目录下创建或修改 .htaccess 文件,添加以下规则:

    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteRule ^tags/(.*)$ /tags.php/$1 [L]
    </IfModule>

重要提醒:修改伪静态配置后,需要重启 Nginx/Apache 服务才能生效。


完成以上四个步骤后,你的 DedeCMS tag 路径就会成功修改为拼音格式了。

  1. 数据库:为 tag 表增加了 pinyin 字段。
  2. 内核:修改了 archive.helper.php,在保存标签时自动生成并存储拼音。
  3. 入口文件:重写了 tags.php,使其能够识别拼音参数并查询对应的中文标签。
  4. 服务器配置:配置了伪静态规则,使拼音 URL 能够被正确解析。

注意事项

  • 拼音类文件pinyin.class.php 的质量直接影响拼音转换的准确性,请选择一个可靠的版本。
  • 历史数据:这个修改只对新添加的 tag 生效,你之前创建的 tag 数据库中没有拼音,访问它们的拼音路径会 404,你需要手动更新旧数据,或者写一个简单的脚本来批量为旧 tag 生成拼音并更新数据库。
  • 备份:在修改任何核心文件(如 archive.helper.php)和数据库结构之前,务必备份!
-- 展开阅读全文 --
头像
C语言如何操作SQLServer生成PDF?
« 上一篇 昨天
dede如何调用当前顶级栏目名称?
下一篇 » 昨天

相关文章

取消
微信二维码
支付宝二维码

目录[+]