- 前端搜索框表单
- 后端PHP接收关键字
- 核心搜索逻辑(
search.php) - 搜索结果模板
- 常见问题与自定义修改
前端搜索框表单
在 DedeCMS 的默认模板中,搜索框通常位于 templets/default/search.htm 文件里,它的 HTML 表单结构如下:

<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php" method="get">
<div class="form">
<h4>搜索</h4>
<input type="hidden" name="kwtype" value="0" />
<input type="text" name="q" class="search-keyword" id="keyword" />
<select name="searchtype" class="search-option">
<option value="title" selected='1'>标题</option>
<option value="title,keyword">标题+关键词</option>
</select>
<button type="submit" class="search-submit">搜索</button>
</div>
</form>
关键点解析:
action="{dede:global name='cfg_phpurl'/}/search.php":表单数据会被提交到网站根目录下的phpurl(默认是/plus/)中的search.php文件。method="get":使用 GET 方式提交,这意味着搜索关键字会直接显示在 URL 中,.../search.php?q=织梦CMS。<input type="text" name="q" ...>:这是用户输入搜索关键字的核心输入框。name="q"是固定的,search.php文件会通过$_GET['q']来获取这个值。<input type="hidden" name="kwtype" value="0" />:这是一个隐藏字段,用于定义关键字的类型。0代表普通关键字,1代表高级搜索(模糊匹配),2代表精确匹配,你可以通过修改这里的值来改变搜索的精确度。<select name="searchtype" ...>:这个下拉框让用户选择搜索范围。value="title":只搜索文章标题。value="title,keyword":搜索文章标题和关键词。
后端PHP接收关键字
当用户点击搜索按钮后,浏览器会将表单数据发送到 plus/search.php,这个文件是 DedeCMS 搜索功能的核心。
在 search.php 的开头部分,你会看到类似这样的代码:
// 获取搜索关键字 $keyword = trim($_GET['q']); // 获取搜索类型 $searchtype = isset($_GET['searchtype']) ? trim($_GET['searchtype']) : 'title'; // 获取关键字类型 $kwtype = isset($_GET['kwtype']) ? intval($_GET['kwtype']) : 0; // ... 其他处理
这里,$_GET['q'] 就是从前端表单 name="q" 的输入框中获取到的用户输入的搜索关键字。

核心搜索逻辑(search.php)
获取到关键字后,search.php 会进行一系列处理,然后构建 SQL 查询语句去数据库中搜索匹配的内容。
主要步骤:
- 关键字处理:对
$keyword进行安全过滤和转义,防止 SQL 注入。 - 构建 SQL
WHERE子句:这是最关键的一步,程序会根据$searchtype和$kwtype的值来动态生成WHERE条件。$searchtype是title:生成的WHERE子句可能类似于WHERE arctitle LIKE '%织梦CMS%'。$searchtype是title,keyword:生成的WHERE子句可能类似于WHERE (arctitle LIKE '%织梦CMS%' OR arckeywords LIKE '%织梦CMS%')。$kwtype是2(精确匹配):生成的WHERE子句会使用 而不是LIKE,WHERE arctitle = '织梦CMS'。
- 执行查询:将构建好的 SQL 语句发送到数据库执行,获取匹配的文章列表。
- 分页处理:如果搜索结果很多,程序会进行分页处理,计算总页数、当前页等。
- 传递数据到模板:程序将搜索结果、分页信息等数据打包,传递给搜索结果模板文件进行渲染。
搜索结果模板
搜索结果的展示页面是由模板文件控制的,默认的模板文件是 templets/default/search.htm。
你可以在这个模板文件中使用 DedeCMS 的模板标签来循环显示搜索结果,

{dede:global name='keyword'/} <!-- 显示用户搜索的关键字 -->
<div class="search_results">
<ul>
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span class="info">([field:pubdate function="MyDate('Y-m-d',@me)"/])</span>
<p>[field:description/]...</p>
</li>
{/dede:list}
</ul>
</div>
<!-- 分页条 -->
<div class="page">
{dede:pagelist listsize='4'/}
</div>
常见问题与自定义修改
问题1:搜索结果不准确或为空怎么办?
- 检查数据库:确保你的文章标题或关键词中确实包含你搜索的文字。
- 检查全文索引:DedeCMS 的默认搜索是基于
LIKE '%关键词%'的,它不依赖数据库的全文索引,所以性能可能不高,但兼容性好,如果需要更强大的搜索,可以考虑集成 Elasticsearch 或 Sphinx 等专业搜索引擎。 - 检查模板标签:在
search.htm中,确保使用了{dede:list}标签来循环输出结果。
问题2:如何修改搜索范围?
假设你想让搜索范围不仅包括“标题”和“标题+关键词”,还要包括“文章内容”。
-
修改前端模板 (
search.htm): 在<select name="searchtype">中添加一个新的option。<select name="searchtype" class="search-option"> <option value="title">标题</option> <option value="title,keyword">标题+关键词</option> <option value="body">文章内容</option> <!-- 新增 --> </select> -
修改后端逻辑 (
plus/search.php): 找到处理$searchtype的代码段,增加对body的判断。// 在 search.php 中找到类似下面的代码块 if($searchtype=='title') { $addquery = " AND (arc.title LIKE '%$keyword%')"; } elseif($searchtype=='title,keyword') { $addquery = " AND (arc.title LIKE '%$keyword%' OR arc.keywords LIKE '%$keyword%')"; } // 新增对 'body' 的处理 elseif($searchtype=='body') { $addquery = " AND (arc.title LIKE '%$keyword%' OR arc.keywords LIKE '%$keyword%' OR arc.body LIKE '%$keyword%')"; } else { $addquery = " AND arc.title LIKE '%$keyword%'"; }注意:这里的
arc.body是一个假设的字段名,你需要检查你的dede_archives表中存储文章内容的字段名,通常是body或content。
问题3:如何修改搜索结果的排序?
默认情况下,搜索结果可能按发布时间倒序排列,如果你想按相关度或点击量排序,需要修改 search.php 中的 SQL 查询语句。
找到构建 SQL 查询的地方,修改 ORDER BY 部分。
按点击量降序排列:
// 原来的 SQL 可能是
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl
FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id
WHERE $addquery $orderquery
LIMIT $startrow,$pagesize";
// 修改 $orderquery 部分
$orderquery = " ORDER BY arc.click DESC"; // 按点击量降序
DedeCMS 的搜索关键字处理流程是:用户在前端 name="q" 的输入框输入内容 -> 提交到 plus/search.php -> search.php 通过 $_GET['q'] 获取关键字 -> 根据其他参数构建 SQL 查询 -> 从数据库获取数据 -> 传递给 search.htm 模板进行渲染。
理解了这个流程,你就可以根据需要自由地修改搜索功能,例如调整搜索范围、改变排序方式、优化搜索性能等。
