dede代码全站搜如何高效实现?

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

“全站搜索”是网站非常重要的一个功能,允许用户在网站的所有内容(如文章、产品、软件等)中查找信息,在 DedeCMS 中,这个功能主要依赖两个核心部分:

dede 代码 全站搜
(图片来源网络,侵删)
  1. 搜索表单:用户在前端输入关键词并提交的界面。
  2. 搜索结果页:后端接收关键词,从数据库中查询并展示结果的页面。

下面我将分步讲解如何实现和自定义全站搜索。


第一步:在前台模板中创建搜索表单

这是用户交互的入口,最常见的是将搜索框放在网站的头部 (head.htm) 或其他公共位置。

核心代码:

<form name="formsearch" action="{dede:global.cfg_cmspath/}/search.php" method="get">
    <div class="search-box">
        <input type="hidden" name="kwtype" value="0" id="kwtype" />
        <input type="text" name="q" id="q" class="search-text" placeholder="请输入搜索关键词" />
        <button type="submit" class="search-submit">搜索</button>
    </div>
</form>

代码解析:

dede 代码 全站搜
(图片来源网络,侵删)
  • action="{dede:global.cfg_cmspath/}/search.php"
    • {dede:global.cfg_cmspath/} 是 DedeCMS 的全局变量,代表你的网站根目录 URL,http://www.yoursite.com
    • search.php 是 DedeCMS 默认的搜索处理脚本,所有搜索请求都会被发送到这个文件。
  • method="get":使用 GET 方法提交,这样搜索关键词会出现在 URL 中(如 ?q=织梦),方便分享和收藏。
  • <input type="hidden" name="kwtype" value="0">
    • kwtype 是控制搜索范围的关键参数。value="0" 表示在所有内容中搜索(默认)。
    • value="1" 表示仅在文章栏目中搜索。
    • value="2" 表示仅在产品栏目中搜索。
    • 你可以通过修改这个值来创建不同范围的搜索。
  • <input type="text" name="q" id="q">
    • name="q" 是用户输入的关键词字段名,这个字段名在 search.php 中是固定的,不能随意修改
    • id="q" 供 CSS 和 JavaScript 调用。

第二步:理解搜索结果页模板 (search.htm)

当用户提交搜索表单后,search.php 会处理请求,然后加载 search.htm 模板来展示结果。

search.htm 文件通常位于你的模板目录下,/templets/default/search.htm

核心代码结构:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">{dede:global.title/} - 搜索结果</title>
    <!-- 其他 head 内容 -->
</head>
<body>
    <!-- 1. 搜索结果页的顶部搜索框(可以复用第一步的代码) -->
    {dede:include filename="head.htm"/}
    <!-- 2. 搜索关键词提示 -->
    <div class="path">
        <h3>搜索“<strong>{dede:global name='q'/}</strong}”的结果</h3>
    </div>
    <!-- 3. 搜索结果列表 (核心部分) -->
    <div class="search-result-list">
        {dede:arclist titlelen='50' orderby='rand'}
        <div class="result-item">
            <h4><a href="[field:arcurl/]">[field:title/]</a></h4>
            <p class="summary">[field:description function='cn_substr(@me, 200)'/]...</p>
            <div class="info">
                <span>发布时间:[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
                <span>来源:[field:typename/]</span>
            </div>
        </div>
        {/dede:arclist}
    </div>
    <!-- 4. 搜索结果分页 -->
    <div class="page-nav">
        {dede:pagelist listsize='5'/}
    </div>
    <!-- 5. 页脚 -->
    {dede:include filename="footer.htm"/}
</body>
</html>

代码解析:

dede 代码 全站搜
(图片来源网络,侵删)
  1. {dede:global name='q'/}:这是一个全局变量,用于获取用户在搜索框中输入的关键词,并显示在页面上。
  2. {dede:arclist ...}:这是最关键的部分,默认情况下,search.php 会将搜索到的文章ID存入一个特定的数组,arclist 标签通过这个数组来调用文章。
    • titlelen='50'长度限制。
    • orderby='rand':随机排序,你也可以使用 id(按ID排序)或 click(按点击量排序)等。
    • [field:arcurl/]:文章链接。
    • [field:title/]
    • [field:description/]:通常用 cn_substr 函数截取前200个字符。
    • [field:pubdate/]:发布时间。
    • [field:typename/]:所属栏目名。

第三步:修改搜索结果页的调用方式(高级自定义)

默认的 arclist 调用有时不够灵活,比如你可能想同时搜索文章、产品、软件等不同模型的内容,这时就需要修改 search.htm 中的标签。

使用 loop 标签(推荐)

loop 标签可以更自由地循环输出任意 SQL 查询结果。

<!-- 在 search.htm 中 -->
<div class="search-result-list">
    {dede:loop table='dede_archives' sort='id' row='10' if='title like "%{dede:global.q/}%"'}
    <div class="result-item">
        <h4><a href="[field:arcurl/]">[field:title function='cn_substr(@me, 50)'/]</a></h4>
        <p class="summary">[field:description function='cn_substr(@me, 200)'/]...</p>
        <div class="info">
            <span>发布时间:[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
        </div>
    </div>
    {/dede:loop}
</div>

loop 标签参数说明:

  • table='dede_archives':指定查询的数据表。dede_archives 是 DedeCMS 存储所有文章、产品等文档主信息的核心表。
  • sort='id':排序方式,按 ID 降序(默认)。
  • row='10':每页显示 10 条结果。
  • if='title like "%{dede:global.q/}%"'这是查询条件title like '%关键词%' 表示在标题中模糊匹配用户输入的关键词 {dede:global.q/}

使用 sql

sql 标签功能更强大,可以执行任意复杂的 SQL 语句,但需要你对 DedeCMS 数据库结构有一定了解。

<!-- 在 search.htm 中 -->
<div class="search-result-list">
    {dede:sql sql='Select id, title, description, pubdate from dede_archives where title like "%~q~%" order by id desc limit 0, 10'}
    <div class="result-item">
        <h4><a href="[field:arcurl/]">[field:title function='cn_substr(@me, 50)'/]</a></h4>
        <p class="summary">[field:description function='cn_substr(@me, 200)'/]...</p>
        <div class="info">
            <span>发布时间:[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
        </div>
    </div>
    {/dede:sql}
</div>

注意:

  • sql 标签中,关键词变量需要用 ~q~ 来表示,而不是 {dede:global.q/}
  • [field:arcurl/]sql 标签中可能无法直接使用,因为 arcurlarclist 标签的底层字段,你需要手动拼接 URL,<a href="/plus/view.php?aid=[field:id/]">

第四步:修改搜索核心文件 search.php(高级)

如果你想从根本上改变搜索逻辑,比如修改分页方式、增加搜索权重、修改返回结果集等,就需要直接编辑 /plus/search.php 文件。

search.php 的工作流程:

  1. 接收参数:获取 q(关键词)、kwtype(搜索类型)、searchtype(搜索方式,如精确/模糊)、typeid(指定栏目ID)等。
  2. 构建 SQL 查询:根据参数,组合出最终的 SQL 查询语句,核心代码通常在 if($kwtype==0) 分支里。
  3. 执行查询并分页:使用 DedeSql 类执行查询,并调用 GetPageList() 等函数进行分页处理。
  4. 传递变量到模板:将查询到的结果、关键词、分页信息等,通过 SetTemplateVar() 等函数传递给 search.htm 模板。

一个常见的修改需求:增加内容正文的搜索。

默认搜索只搜标题,如果你想同时搜索文章的 title)和 body(正文/内容),可以修改 search.php 中的 SQL 语句。

找到类似这样的代码:

// 大约在 search.php 的 150 行左右
$query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.senddate,arc.arcrank,arc.mid,arc.litpic,channel.addtable 
FROM `dede_archives` arc 
LEFT JOIN `dede_arctype` tp on tp.id=arc.typeid 
LEFT JOIN `dede_channeltype` channel on channel.id=arc.channel 
WHERE arc.arcrank > -1 AND arc.title like '%$keyword%' 
$orderby $limit";

将其修改为:

// 增加对正文的搜索,假设文章内容存储在 dede_addonarticle 表的 body 字段
// 并且你的文章模型ID是 1 (通常文章模型ID为1)
$query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.senddate,arc.arcrank,arc.mid,arc.litpic,channel.addtable 
FROM `dede_archives` arc 
LEFT JOIN `dede_arctype` tp on tp.id=arc.typeid 
LEFT JOIN `dede_channeltype` channel on channel.id=arc.channel 
LEFT JOIN `dede_addonarticle` art ON arc.id = aid 
WHERE arc.arcrank > -1 AND (arc.title like '%$keyword%' OR art.body like '%$keyword%') 
$orderby $limit";

修改前务必备份 search.php 文件!


功能实现 关键文件/代码 说明
前台搜索框 head.htm 或其他页面 <form action="search.php" method="get"><input name="q">
搜索结果页 /templets/default/search.htm 使用 {dede:global.q/} 显示关键词,{dede:arclist/}{dede:loop/} 显示结果。
简单自定义结果 search.htm 修改 loopsql 标签的 if 条件和 table 来改变查询逻辑。
深度自定义搜索 /plus/search.php 修改 SQL 查询语句、分页逻辑等,功能最强大,但风险也最高。

对于大多数用户来说,通过修改 search.htm 模板中的 {dede:loop} 标签就足以满足大部分全站搜索的自定义需求,只有在需要非常复杂的搜索逻辑时,才建议去修改 search.php

-- 展开阅读全文 --
头像
C语言学生管理系统课程设计如何实现核心功能?
« 上一篇 03-18
哪里能下载到C语言程序设计视频教程?
下一篇 » 03-18

相关文章

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