下面我将为您提供两种实现方法,一种是简单直接的前端改造,另一种是更强大的后端改造,您可以根据自己的需求选择。
简单前端改造(推荐新手)
这种方法的核心思路是:在默认的搜索框中增加一个参数,告诉系统要去标签表里查找。 它不需要修改核心文件,兼容性较好,但搜索结果页面可能会包含不相关的文章。
操作步骤:
-
找到搜索表单 打开你网站模板目录下的搜索文件,通常是
templets/default/search.htm,用代码编辑器打开它。 -
修改搜索表单 在
<form>标签中,增加一个隐藏的input字段,用于指定搜索模型。找到类似这样的代码:
<form name="formsearch" action="/plus/search.php"> <div class="form"> <h4>搜索</h4> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" value="titlekeyword" /> <input name="q" type="text" class="search-keyword" id="search-keyword" placeholder="请输入关键词" /> <button type="submit" class="search-submit">搜索</button> </div> </form>修改为:
<form name="formsearch" action="/plus/search.php"> <div class="form"> <h4>搜索</h4> <!-- 修改这里,增加一个隐藏字段,指定搜索typeid为0,这会触发全站搜索,包括标签 --> <input type="hidden" name="typeid" value="0" /> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" value="titlekeyword" /> <input name="q" type="text" class="search-keyword" id="search-keyword" placeholder="请输入关键词" /> <button type="submit" class="search-submit">搜索</button> </div> </form>关键点: 增加了
<input type="hidden" name="typeid" value="0" />,当typeid为0时,DedeCMS的搜索机制会扩大搜索范围,其中就包括了dedi_tagindex(标签索引表)。 -
(可选)优化搜索结果页 默认的搜索结果页 (
/plus/search.php) 可能会将包含关键词标签的文章排在后面,或者显示效果不理想,你可以通过修改模板templets/default/search.htm来调整。在搜索结果循环中(通常由
{dede:list}标签完成),你可以通过判断文章的标签来优化显示。你想在文章标题旁边显示这篇文章包含的标签,可以这样做: 在
{dede:list}循环内部,找到</a>标签后,添加以下代码:{dede:field.tags runphp='yes'} if(!empty(@me)){ $tags = ''; $tagArr = explode(',', @me); foreach($tagArr as $tag){ $tags .= '<a href="/tags.php?/'.$tag.'.html">'.$tag.'</a> '; } @me = ' | 标签:' . $tags; }else{ @me = ''; } {/dede:field.tags}这样,当用户搜索一个标签时,搜索结果的文章旁边就会显示出该文章的所有标签,用户体验更好。
强大的后端改造(推荐追求功能和性能的用户)
这种方法通过修改DedeCMS的核心搜索文件,实现一个专门的“标签搜索”功能,它的优点是:
- 功能独立:可以创建一个专门的标签搜索页面。
- 结果精准:只返回包含该标签的文章,不包含标题或内容中有关键词但无标签的文章。
- 性能更好:直接查询标签关联表,效率更高。
操作步骤:
-
修改核心搜索文件 打开
include/arc.searchview.class.php文件,这个文件是处理搜索逻辑的核心。 -
增加标签搜索条件 在这个文件中找到
function GetKeywordList()函数(大约在580行左右),在这个函数里,你需要添加对标签的查询逻辑。找到类似这样的代码段(这是处理关键词搜索的地方):
// 关键词搜索 if($this->Keyword != '') { $keywordsql = ''; $keywords = explode(' ', $this->Keyword); foreach($keywords as $k) { $k = trim($k); if($k != '') { if($keywordsql == '') $keywordsql .= " ("; else $keywordsql .= " OR "; $keywordsql .= " ( CONCAT(arc.title,arc.shorttitle) LIKE '%$k%' OR arc.keywords LIKE '%$k%' OR arc.body LIKE '%$k%' ) "; } } if($keywordsql != '') $keywordsql .= ") "; }在这个
if语句块的后面(之后),添加我们自己的标签搜索逻辑:// 标签搜索 $tagkeywordsql = ''; if($this->Keyword != '') { $tagkeywordsql = " arc.id IN (SELECT aid FROM `dede_taglist` WHERE tag LIKE '%".$this->Keyword."%') "; } -
合并搜索条件 现在我们有了两个搜索条件:
$keywordsql/内容)和$tagkeywordsql(标签),我们需要将它们合并起来。在文件的后面找到构建最终SQL查询的地方(通常在
function GetArcList($typeid, $channelid, $sortid, $ismake, $row, $col, $titlelen, $infolen, $imgwidth, $imgheight, $listtype, $orderby, $keyword, $subday, $channeltype, $adminlist, $mtype, $tbname, $moneydesc, $qtinfo)函数里),找到类似这样的代码:if($keywordsql != '') { $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule, tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id WHERE $keywordsql And arc.arcrank > -1 $orderquery limit $limitstart,$row"; }修改这个
if块,将我们的标签搜索条件也加进去,使用OR连接:if($keywordsql != '' || $tagkeywordsql != '') { $final_where_sql = ''; if($keywordsql != '') $final_where_sql .= $keywordsql; if($tagkeywordsql != ''){ if($final_where_sql != '') $final_where_sql .= " OR "; $final_where_sql .= $tagkeywordsql; } $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule, tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id WHERE $final_where_sql And arc.arcrank > -1 $orderquery limit $limitstart,$row"; }代码解释:
- 我们创建了一个新的变量
$final_where_sql来存放合并后的搜索条件。 - 如果
$keywordsql存在(即有标题/内容搜索词),就先赋值给它。 - 如果
$tagkeywordsql也存在(即有标签搜索词),并且$final_where_sql不为空,就加上OR,然后再把标签搜索条件赋值给它。 - 在最终的SQL查询中,我们使用
$final_where_sql。
- 我们创建了一个新的变量
-
创建独立的标签搜索页面(可选) 如果你希望有一个专门的“标签搜索”入口和结果页,而不是和普通搜索混在一起,可以这样做:
- 创建新页面:在后台创建一个新页面,比如叫“标签搜索”,内容模板选择一个空模板。
- 修改模板:在这个模板里,使用自定义表单或直接写一个跳转的
<form>,action指向/plus/search.php,并增加一个特殊的隐藏字段,<input type="hidden" name="searchtype" value="tagonly">。 - 修改核心文件:回到
arc.searchview.class.php,在GetKeywordList函数的最开始,增加对这个特殊searchtype的判断:// 专门只搜标签 if($this->SearchType == 'tagonly') { $tagkeywordsql = " arc.id IN (SELECT aid FROM `dede_taglist` WHERE tag LIKE '%".$this->Keyword."%') "; $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule, tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id WHERE $tagkeywordsql And arc.arcrank > -1 $orderquery limit $limitstart,$row"; return $query; }这样,当用户通过这个专门的搜索页面搜索时,就只会搜索标签了。
总结与建议
| 特性 | 方法一 (前端改造) | 方法二 (后端改造) |
|---|---|---|
| 实现难度 | 简单,只需修改模板文件 | 较难,需要修改核心PHP文件 |
| 兼容性 | 高,不涉及核心,升级影响小 | 低,修改核心文件,升级后可能被覆盖 |
| 搜索精准度 | 较低,可能包含不相关结果 | 高,结果完全匹配标签 |
| 功能独立性 | 无法独立,与普通搜索混合 | 可以,能创建独立的标签搜索功能 |
| 性能 | 一般,依赖typeid=0的全局搜索 |
较好,直接查询关联表 |
| 推荐人群 | 新手、不想动核心代码的用户 | 开发者、对功能和性能有高要求的用户 |
对于绝大多数用户,我推荐从方法一开始,它简单、安全,能满足基本需求,如果你对搜索结果不满意,或者网站功能复杂,再考虑升级到方法二。
重要提示:在修改任何核心文件(如 arc.searchview.class.php)之前,务必备份原文件!这样即使修改出错,也能轻松恢复。
