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

- 搜索表单:用户在前端输入关键词并提交的界面。
- 搜索结果页:后端接收关键词,从数据库中查询并展示结果的页面。
下面我将分步讲解如何实现和自定义全站搜索。
第一步:在前台模板中创建搜索表单
这是用户交互的入口,最常见的是将搜索框放在网站的头部 (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>
代码解析:

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:global name='q'/}:这是一个全局变量,用于获取用户在搜索框中输入的关键词,并显示在页面上。{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标签中可能无法直接使用,因为arcurl是arclist标签的底层字段,你需要手动拼接 URL,<a href="/plus/view.php?aid=[field:id/]">。
第四步:修改搜索核心文件 search.php(高级)
如果你想从根本上改变搜索逻辑,比如修改分页方式、增加搜索权重、修改返回结果集等,就需要直接编辑 /plus/search.php 文件。
search.php 的工作流程:
- 接收参数:获取
q(关键词)、kwtype(搜索类型)、searchtype(搜索方式,如精确/模糊)、typeid(指定栏目ID)等。 - 构建 SQL 查询:根据参数,组合出最终的 SQL 查询语句,核心代码通常在
if($kwtype==0)分支里。 - 执行查询并分页:使用
DedeSql类执行查询,并调用GetPageList()等函数进行分页处理。 - 传递变量到模板:将查询到的结果、关键词、分页信息等,通过
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 |
修改 loop 或 sql 标签的 if 条件和 table 来改变查询逻辑。 |
| 深度自定义搜索 | /plus/search.php |
修改 SQL 查询语句、分页逻辑等,功能最强大,但风险也最高。 |
对于大多数用户来说,通过修改 search.htm 模板中的 {dede:loop} 标签就足以满足大部分全站搜索的自定义需求,只有在需要非常复杂的搜索逻辑时,才建议去修改 search.php。
