案例背景
假设我们有一个旅游博客网站,使用 DedeCMS 5.7 / 5.8 / 6.x 版本,网站包含文章、图集、软件下载等多个频道,我们的目标是:

- 基础功能:实现一个在文章标题和内容中搜索的关键词搜索框。
- 高级功能:支持按频道(文章、图集)、发布时间、关键字标签进行筛选。
- 用户体验:搜索结果页美观、分页清晰,并记录用户的搜索词。
- SEO优化:搜索结果页 URL 规范,利于搜索引擎收录。
第一步:创建搜索表单(前端页面)
这是用户交互的第一步,我们把它放在网站的头部 head.htm 模板文件中,这样所有页面都可以使用。
文件路径:/templets/default/head.htm
代码实现:
<div class="search-box">
<form name="formsearch" action="{dede:global.cfg_cmspath/}/search.php" method="get">
<input type="hidden" name="kwtype" value="0" id="kwtype" />
<input type="text" name="q" class="search-keyword" id="search-keyword" placeholder="请输入搜索关键词..." />
<select name="searchtype" id="searchtype" class="search-type">
<option value="title" selected="selected">标题</option>
<option value="body">内容</option>
</select>
<button type="submit" class="search-submit">搜索</button>
</form>
</div>
代码解析:

action="{dede:global.cfg_cmspath/}/search.php":指定搜索表单提交的地址是 DedeCMS 自带的search.php文件。name="formsearch":表单的固定名称,DedeCMS 搜索程序会识别它。name="q":这是最重要的参数,用户输入的搜索关键词将通过q这个变量传递给search.php,你也可以使用keyword,但q更通用。name="kwtype":指定搜索范围。0表示在所有频道中搜索;1仅在文章频道中搜索;2仅在软件频道中搜索,以此类推。name="searchtype":指定搜索字段。title只搜索文章标题,body搜索文章正文。placeholder:输入框的提示文本,提升用户体验。
第二步:配置搜索结果页模板
当用户提交搜索表单后,search.php 会处理请求并调用一个专门的模板文件来展示结果。
创建模板文件
在 /templets/default/ 目录下新建一个文件,命名为 search.htm。
文件路径:/templets/default/search.htm
编写模板代码
这是一个功能比较完整的搜索结果页模板,包含了结果列表、分页和高级筛选。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:global name='keyword'/} - 搜索结果 - {dede:global.cfg_webname/}</title>
<link rel="stylesheet" href="{dede:global.cfg_cmspath/}/templets/default/css/style.css">
</head>
<body>
<!-- 头部、导航等省略 -->
<div class="main">
<div class="search-result-main">
<h1>搜索结果</h1>
<p class="search-info">为您找到与 <strong>"{dede:global name='keyword'/}"</strong> 相关的结果 <strong>{dede:global name='resultcount'/}</strong> 个</p>
<!-- 高级筛选 -->
<div class="search-filter">
<span>频道筛选:</span>
<a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}" {dede:global.name='typeid'/ == '' ? 'class="active"' : ''}>全部</a>
<a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&typeid=1" {dede:global.name='typeid'/ == '1' ? 'class="active"' : ''}>文章</a>
<a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&typeid=2" {dede:global.name='typeid'/ == '2' ? 'class="active"' : ''}>图集</a>
<!-- 其他频道typeid... -->
</div>
<!-- 搜索结果列表 -->
<div class="result-list">
{dede:list pagesize='10'}
<div class="result-item">
<h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
<p class="result-summary">[field:info/]...</p>
<div class="result-meta">
<span class="result-type">[field:typename/]</span>
<span class="result-date">[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</div>
</div>
{/dede:list}
</div>
<!-- 分页 -->
<div class="page-nav">
{dede:pagelist listsize='5' listitem='index,pre,next,end,pageno'}
</div>
</div>
</div>
</div>
<!-- 底部等省略 -->
</body>
</html>
代码解析:
{dede:global name='keyword'/}:获取用户搜索的关键词,用于页面标题和提示信息。{dede:global name='resultcount'/}:获取搜索到的结果总数。- 高级筛选链接:
typeid=1:这是 DedeCMS 中“文章”频道的 ID,你可以在后台“频道模型”中查看各个频道的 ID。&typeid=1通过 GET 参数传递,实现按频道筛选。
{dede:list}:pagesize='10':每页显示 10 条结果。[field:arcurl/]:文章链接。[field:title/]。[field:info/]:自动截取)。[field:typename/]:文章所属栏目名称。[field:pubdate/]:发布日期。
{dede:pagelist}:用于生成分页导航。
第三步:后台设置与优化
为了让搜索功能更强大,我们需要在 DedeCMS 后台进行一些设置。
开启“使用全文索引”
这是提升搜索速度和准确度的关键步骤。
- 路径:后台 -> 系统 -> 系统基本参数 -> 核心设置
- 找到:
是否开启全文索引-> 选择“是” - 作用:开启后,DedeCMS 会对文章内容建立索引,搜索速度会快很多,尤其是在数据量大的时候。
重新生成索引
设置开启后,需要重新生成索引才能生效。
- 路径:后台 -> 生成 -> 目录管理 -> 重新生成 HTML -> 选择“仅重新生成文档HTML”
- 作用:系统会遍历所有文章,为它们建立搜索索引。
设置“搜索页面”
- 路径:后台 -> 系统 -> 系统基本参数 -> 搜索引擎优化
- 找到:
搜索页面-> 设置为search.php - 作用:确保搜索结果的 URL 是
search.php?q=关键词的形式,而不是默认的plus/search.php。
第四步:高级功能扩展
我们的基础搜索已经可以用了,我们来实现更高级的功能。
扩展1:按发布时间范围搜索
修改 search.htm 模板,增加时间筛选的表单。
在 search-filter div 中添加:
<div class="search-filter">
<span>时间筛选:</span>
<a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime=&endtime=">全部时间</a>
<a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime={dede:php}echo date('Y-m-d', time()-86400);{/dede:php}&endtime={dede:php}echo date('Y-m-d');{/dede:php}">一天内</a>
<a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime={dede:php}echo date('Y-m-d', time()-86400*7);{/dede:php}&endtime={dede:php}echo date('Y-m-d');{/dede:php}">一周内</a>
<a href="{dede:global name='phpurl'/}/search.php?q={dede:global name='urlencode keyword'/}&starttime={dede:php}echo date('Y-m-d', time()-86400*30);{/dede:php}&endtime={dede:php}echo date('Y-m-d');{/dede:php}">一月内</a>
</div>
代码解析:
&starttime=和&endtime=是 DedeCMS 搜索程序支持的参数,用于限定发布时间。{dede:php}...{/dede:php}标签允许我们在模板中直接执行 PHP 代码,这里用来动态计算日期。
扩展2:记录热门搜索词
我们可以利用 DedeCMS 的自定义标记功能,记录并展示热门搜索词。
创建数据表
在数据库中执行以下 SQL 语句(#__ 前缀请根据你的网站配置修改):
CREATE TABLE `dede_search_keywords` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `keyword` varchar(100) NOT NULL, `count` int(10) unsigned NOT NULL DEFAULT '0', `resultcount` int(10) unsigned NOT NULL DEFAULT '0', `addtime` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `keyword` (`keyword`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
修改 search.php 文件
在 search.php 文件中找到处理搜索结果的部分,在查询数据库之前,添加记录搜索词的逻辑。
在 search.php 中找到类似 if($typeid > 0) $addquery .= " And arc.typeid='$typeid' "; 的地方,在其上方添加:
// --- 记录搜索词开始 --- require_once(DEDEINC."/search.class.php"); $sp = new Search(); $sp->RecordKeyword($keyword, $typeid, $resultnum); // --- 记录搜索词结束 --- if($typeid > 0) $addquery .= " And arc.typeid='$typeid' ";
在首页模板中调用热门搜索词
在首页 index.htm 的合适位置(比如页脚)添加以下代码:
<div class="hot-search">
<h3>热门搜索</h3>
{dede:hotwords num='10' sublen='6'}
<a href="[field:link/]">[field:keyword/]</a>
{/dede:hotwords}
</div>
代码解析:
{dede:hotwords}是 DedeCMS 的一个自定义标记,用于从#@__hotwords表(我们上面新建的dede_search_keywords表)中读取热门关键词。num='10':显示 10 个热门词。[field:link/]:生成搜索该词的链接。[field:keyword/]:显示关键词。
第五步:美化与最终调试
- CSS 样式:为
search-box,result-item,page-nav等元素编写 CSS 样式,让它们看起来更美观。 - 测试:尝试搜索不同的关键词,测试分页、筛选、高亮(DedeCMS 默认会高亮搜索词)等功能是否正常。
- 性能:如果网站数据量非常大,确保第一步的“全文索引”已经开启,否则搜索会非常慢。
通过以上五个步骤,我们就成功地为 DedeCMS 网站构建了一个功能完善、用户体验良好、具备一定SEO优化的搜索系统。
- 基础层:通过
head.htm的表单和search.htm的模板实现了基本搜索。 - 优化层:通过后台开启“全文索引”大幅提升了搜索性能。
- 扩展层:通过修改模板和 PHP 文件,增加了时间筛选和热门搜索词记录功能。
这个案例可以根据你的具体需求进行进一步的修改和扩展,例如增加按作者、按标签等筛选条件。
