默认的织梦搜索功能比较基础,通常只搜索文章标题和内容,自定义搜索可以让我们:

(图片来源网络,侵删)
- 指定搜索模型:只在文章、软件、商品等特定模型中搜索。
- 指定搜索栏目:只在选定的栏目及其子栏目中搜索。
- 指定搜索关键词:可以同时搜索标题、内容、作者等多个字段。
- 自定义搜索结果页:设计更美观、信息更丰富的搜索结果展示页面。
下面我将分步介绍两种最常用和最有效的自定义搜索方法:
利用织梦的“高级搜索”功能(推荐,简单易用)
这是织梦内置的功能,通过一个独立的搜索页面,让用户可以自由选择搜索条件,非常灵活。
第1步:创建高级搜索页面模板
- 在你的网站模板目录(通常是
/templets/your_template/)下,新建一个文件,命名为advancedsearch.htm。 - 将默认的搜索页模板
search.htm的内容复制到advancedsearch.htm中,然后进行修改。
第2步:修改模板文件 advancedsearch.htm
在模板中,你需要添加一个表单,这个表单将包含所有自定义的搜索选项,核心是使用织梦提供的自定义表单标签 {dede:global name='keyword'/} 和 {dede:global name='typeid'/}。
示例代码:

(图片来源网络,侵删)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">高级搜索 - {dede:global.cfg_webname/}</title>
</head>
<body>
<h1>高级搜索</h1>
<form name="search" action="{dede:global name='cfg_phpurl'/}/search.php" method="get">
<!-- 1. 关键词输入框(这是必须的) -->
<div>
<label for="keyword">关键词:</label>
<input type="text" name="keyword" id="keyword" value="{dede:global.name='keyword'/}" />
</div>
<hr>
<!-- 2. 搜索模型选择(可选) -->
<div>
<label>搜索模型:</label>
<select name="searchtype">
<option value="title">仅搜索标题</option>
<option value="body">仅搜索内容</option>
<option value="data" selected>搜索所有字段</option>
<!-- 如果你在后台添加了其他自定义模型,这里也会自动生成选项 -->
</select>
</div>
<!-- 3. 栏目选择(可选) -->
<div>
<label>栏目范围:</label>
<select name="typeid" style="width:200px">
<option value='0'>所有栏目</option>
{dede:channel type='son' currentstyle='<option value=~id~ selected>~typename~</option>'}
<option value='id'>typename</option>
{/dede:channel}
</select>
</div>
<!-- 4. 时间范围(可选,需要配合JS实现,这里仅作示例) -->
<div>
<label>发布时间:</label>
<select name="time">
<option value='1'>一天内</option>
<option value='3'>三天内</option>
<option value='7'>一周内</option>
<option value='30'>一月内</option>
<option value='0'>全部时间</option>
</select>
</div>
<hr>
<div>
<input type="submit" name="submit" value="开始搜索" />
</div>
</form>
</body>
</html>
代码解释:
action="{dede:global.name='cfg_phpurl'/}/search.php":表单提交地址,固定写法。name="keyword":关键词输入框,name属性必须是keyword。name="typeid":栏目选择框,name属性必须是typeid。name="searchtype":搜索类型选择框,name属性必须是searchtype,它的值(如title,body)会被search.php接收并处理。{dede:channel ...}:这是一个循环标签,用于自动列出所有一级栏目。currentstyle用于高亮当前选中的栏目。
第3步:使用高级搜索页面
- 在网站的某个位置(如页脚、顶部导航栏)添加一个链接到这个高级搜索页面:
<a href="/advancedsearch.htm">高级搜索</a>
- 访问这个链接,用户就可以看到自定义的搜索表单了。
修改默认搜索页 search.php 和 search.htm(更灵活,功能更强)
如果你希望默认的搜索行为就包含自定义选项,或者需要更复杂的逻辑(例如按时间、作者等搜索),你需要直接修改 search.php 文件。
第1步:修改 search.php 文件
search.php 是处理搜索请求的核心文件,我们需要修改它,让它能接收并处理我们自定义的参数。
- 打开
/include/目录下的search.php文件。 - 找到获取参数的代码段,通常在文件开头,默认的代码是:
$keyword = empty($keyword) ? '' : preg_replace("# #", "%", $keyword); $typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0; - 在此基础上,添加你需要的自定义参数,我们增加一个
mid(模型ID) 参数和一个time(时间) 参数。
修改后的 search.php 示例:
// ... 文件顶部其他代码 ...
// 获取并处理关键词
$keyword = empty($keyword) ? '' : preg_replace("# #", "%", $keyword);
// 获取并处理栏目ID
$typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0;
// ====== 新增自定义参数处理 ======
// 1. 获取模型ID (mid)
$mid = isset($mid) && is_numeric($mid) ? intval($mid) : 0; // 0表示搜索所有模型
// 2. 获取时间范围 (time)
$addtime = '';
if (isset($time) && is_numeric($time)) {
if ($time == 0) {
$addtime = ''; // 全部时间
} else {
$addtime = " AND arc.senddate > UNIX_TIMESTAMP() - $time * 3600 * 24"; // $time天内
}
}
// =================================
// ... 接下来是构建SQL查询的部分 ...
// 默认的查询条件
$orwhere = " (arc.title like '%$keyword%') ";
$orwhere .= " OR arc.body like '%$keyword%' ";
// ====== 在构建SQL查询时加入自定义条件 ======
// 将模型ID和时间条件加入到主查询中
$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 $orwhere AND arc.arcrank > -1 ";
// 如果指定了栏目,则添加栏目条件
if ($typeid > 0) {
$query .= " AND arc.typeid IN (SELECT id FROM `dede_arctype` WHERE id='$typeid' OR topid='$typeid') ";
}
// 如果指定了模型,则添加模型条件
if ($mid > 0) {
$query .= " AND arc.channel = '$mid' ";
}
// 如果指定了时间,则添加时间条件
if ($addtime) {
$query .= $addtime;
}
// ... 后续分页等代码 ...
search.php 修改要点:
- 接收参数:使用
isset()和is_numeric()安全地获取URL传递过来的mid和time参数。 - 构建SQL:在构建最终的SQL查询语句时,使用
AND将新的条件(如arc.channel = '$mid')拼接进去。 - 注意SQL注入:对于来自用户输入的变量(如
$keyword),最好使用dede_filter函数或preg_replace进行过滤,上面的代码已做简单处理。
第2步:修改搜索结果页模板 search.htm
现在我们需要在 search.htm 中添加表单元素,让用户可以提交这些自定义参数。
示例代码:
<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php">
<div>
<input type="hidden" name="kwtype" value="0" />
<input type="text" name="keyword" id="keyword" />
<select name="typeid">
<option value='0'>所有栏目</option>
{dede:channel type='son'}
<option value='id'>typename</option>
{/dede:channel}
</select>
<!-- 新增:模型选择 -->
<select name="mid">
<option value="0">所有模型</option>
<option value="1">文章</option>
<option value="2">软件</option>
<!-- 这里的value需要对应你后台的模型ID -->
</select>
<!-- 新增:时间选择 -->
<select name="time">
<option value="0">全部时间</option>
<option value="1">一天内</option>
<option value="3">三天内</option>
<option value="7">一周内</option>
</select>
<button type="submit">搜索</button>
</div>
</form>
<!-- 搜索结果列表 -->
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
<p>[field:description/]...</p>
</li>
{/dede:list}
<!-- 分页 -->
{dede:pagelist listitem="index,end,pre,next,pageno" listsize="5"/}
第3步:在后台生成HTML
修改完 search.php 和 search.htm 后,需要到织梦后台:
- 生成 -> HTML更新 -> 搜索页面更新,重新生成搜索结果页。
- 或者直接在后台首页点击“更新系统缓存-更新所有”或“一键更新网站”。
总结与建议
| 特性 | 方法一 (高级搜索) | 方法二 (修改默认搜索) |
|---|---|---|
| 实现难度 | 简单,无需修改PHP代码。 | 中等,需要修改核心文件。 |
| 灵活性 | 较高,适合用户自由选择多种条件。 | 极高,可以实现任何复杂的搜索逻辑。 |
| 适用场景 | 大多数网站,需要一个独立的、功能丰富的搜索页面。 | 需要将自定义搜索作为默认行为,或需要非常特殊搜索逻辑的网站。 |
| 维护性 | 模板独立,不影响核心文件,易于维护。 | 修改了核心文件,升级织梦时可能需要重新修改。 |
给新手的建议:
- 优先使用方法一,它足够强大,且安全、易于维护,你可以创建一个“高级搜索”页面,同时保留默认的简单搜索,满足不同用户的需求。
- 方法二适合有二次开发经验的用户,在修改
search.php时,请务必小心,特别是SQL查询部分,避免出现安全漏洞。
通过以上两种方法,你就可以轻松地为你的织梦网站打造出功能强大的自定义搜索了。
