dede如何增加标签搜索功能?

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

下面我将为您提供两种实现方法,一种是简单直接的前端改造,另一种是更强大的后端改造,您可以根据自己的需求选择。


简单前端改造(推荐新手)

这种方法的核心思路是:在默认的搜索框中增加一个参数,告诉系统要去标签表里查找。 它不需要修改核心文件,兼容性较好,但搜索结果页面可能会包含不相关的文章。

操作步骤:

  1. 找到搜索表单 打开你网站模板目录下的搜索文件,通常是 templets/default/search.htm,用代码编辑器打开它。

  2. 修改搜索表单<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(标签索引表)。

  3. (可选)优化搜索结果页 默认的搜索结果页 (/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的核心搜索文件,实现一个专门的“标签搜索”功能,它的优点是:

  • 功能独立:可以创建一个专门的标签搜索页面。
  • 结果精准:只返回包含该标签的文章,不包含标题或内容中有关键词但无标签的文章。
  • 性能更好:直接查询标签关联表,效率更高。

操作步骤:

  1. 修改核心搜索文件 打开 include/arc.searchview.class.php 文件,这个文件是处理搜索逻辑的核心。

  2. 增加标签搜索条件 在这个文件中找到 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."%') ";
    }
  3. 合并搜索条件 现在我们有了两个搜索条件:$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
  4. 创建独立的标签搜索页面(可选) 如果你希望有一个专门的“标签搜索”入口和结果页,而不是和普通搜索混在一起,可以这样做:

    • 创建新页面:在后台创建一个新页面,比如叫“标签搜索”,内容模板选择一个空模板。
    • 修改模板:在这个模板里,使用自定义表单或直接写一个跳转的<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)之前,务必备份原文件!这样即使修改出错,也能轻松恢复。

-- 展开阅读全文 --
头像
C语言groupCount是什么?如何实现?
« 上一篇 03-02
dede修改关键词长度
下一篇 » 03-02

相关文章

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

目录[+]