在 DedeCMS 中,搜索结果页的调用与普通的内容列表页(如栏目页、首页)有本质区别。它不是通过一个固定的模板标签来调用的,而是通过 PHP 代码在搜索过程中动态生成数据并传递给模板。

要修改搜索页的显示,你需要理解两个核心部分:
- 搜索逻辑 (
plus/search.php):这是处理搜索请求、从数据库查询数据的核心文件。 - 搜索模板 (
templets/default/search.htm):这是展示搜索结果的 HTML 模板文件。
下面我将分步详细说明如何进行调用和自定义。
第一步:理解搜索流程
当你在网站前台使用搜索框进行搜索时,流程如下:
- 用户输入关键词,点击搜索。
- 请求被发送到
plus/search.php文件。 search.php接收关键词,根据设定的搜索规则(如搜索范围、排序方式)构建 SQL 查询语句。- 执行查询,获取符合条件的文章列表(包括文章 ID、标题、发布时间等)。
- 将查询结果(一个数组)和一些公共变量(如关键词、总结果数、分页信息等)传递给
search.htm模板。 search.htm模板使用 DedeCMS 的模板标签(如{dede:list}、{dede:field})来循环显示这些数据。
你无法像调用一个普通栏目那样,用 {dede:arclist} 直接调用搜索结果,你操作的模板是 search.htm,而数据来源是 search.php 的处理结果。

第二步:修改搜索模板 (templets/default/search.htm)
这是最常用、最安全的修改方式,你几乎所有的显示逻辑都在这里完成。
显示搜索关键词和结果统计
这些信息通常在搜索结果列表的上方,由 search.php 传递过来,使用 {dede:field} 标签调用。
<div class="search-meta">
<p>搜索关键词:<strong>{dede:keyword/}</strong></p>
<p>搜索结果:共找到 <strong>{dede:count/}</strong> 条相关内容</p>
</div>
{dede:keyword/}: 显示用户搜索的关键词。{dede:count/}: 显示搜索到的总结果数。
循环显示搜索结果列表
这是搜索页的核心,使用 {dede:list} 标签来循环输出每一条搜索结果。
<ul class="search-result-list">
{dede:list pagesize='10'}
<li>
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p class="summary">[field:info/]...</p>
<p class="meta">
发布时间:[field:pubdate function="MyDate('Y-m-d H:i',@me)"/]
来源:[field:source/]
作者:[field:writer/]
</p>
</li>
{/dede:list}
</ul>
常用标签说明:

[field:arcurl/]: 文章的链接地址。[field:title/]: 文章标题。[field:info/]: 默认是文章正文的前部分)。[field:pubdate/]: 文章发布时间,通常配合function格式化,如MyDate('Y-m-d H:i',@me)。[field:source/]: 文章来源。[field:writer/]: 文章作者。pagesize='10': 每页显示的结果数量。
显示分页
当搜索结果很多时,分页是必不可少的,使用 如果你想改变搜索的行为, 这时你需要修改 ⚠️ 重要警告: 修改核心文件有风险,建议在修改前先备份原文件。 默认情况下,搜索结果按 默认高亮是 如果你想创建一个功能更强大的搜索框,比如可以指定栏目、指定时间范围等,你需要自定义搜索表单,并修改 创建自定义搜索表单 (例如在 修改 修改 SQL 查询条件
在构建 这样,搜索就只会在你选择的栏目内进行了。 对于绝大多数用户来说,只修改 {dede:pagelist/}
<div class="page-nav">
{dede:pagelist listsize='4' listitem='pre,next,end,option'/}
</div>
listsize='4': 显示 4 个页码链接。listitem='pre,next,end,option': 定义显示哪些分页元素(上一页、下一页、末页、下拉跳转)。
第三步:修改搜索逻辑 (
plus/search.php)
plus/search.php 文件。示例1:修改排序方式
pubdate(发布时间)降序排列,如果你想改为按 click(点击量)降序排列。
plus/search.php。//获得搜索的关键字 和 //搜索关键字不能为空 这两行代码之后。$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl
FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
WHERE {$orwhere} $orderquery LIMIT $startrow,$pagesize";
$orderquery 变量的定义,默认可能是 $orderquery = "ORDER BY arc.sortrank DESC"; 或 $orderquery = "ORDER BY arc.pubdate DESC";。$orderquery = "ORDER BY arc.click DESC"; // 按点击量降序
// 或者
$orderquery = "ORDER BY arc.id DESC"; // 按文章ID降序
示例2:修改高亮样式
<span class='highlight'>关键词</span>,如果你想修改这个样式名。
search.php 文件中,找到 highlight 函数的定义或调用位置。$body = str_replace($keyword, "<span class='highlight'>".$keyword."</span>", $body);
class 的值即可,例如改为 red-text:$body = str_replace($keyword, "<span class='red-text'>".$keyword."</span>", $body);
.red-text 的样式:.red-text {
color: red;
font-weight: bold;
}
第四步:高级技巧 - 自定义搜索表单
search.php 来接收这些参数。
head.htm 或其他页面)<form action="{dede:global.cfg_cmspath/}/plus/search.php" name="searchform" method="get">
<input type="hidden" name="kwtype" value="0" />
<input type="text" name="q" placeholder="请输入关键词" />
<select name="typeid">
<option value="0">全站</option>
{dede:channel type='son' noself='yes'}
<option value="[field:id/]">[field:typename/]</option>
{/dede:channel}
</select>
<button type="submit">搜索</button>
</form>
action 指向 search.php。name="q" 是关键词的默认字段名。name="typeid" 是指定栏目ID的字段名。plus/search.php 接收参数
在 search.php 中,获取关键词的代码 $keyword = empty($keyword)? '': FilterSearch($keyword); 附近,添加获取栏目ID的代码:$typeid = isset($typeid) && is_numeric($typeid) ? intval($typeid) : 0;
$orwhere 变量的地方,根据 $typeid 的值添加条件。$orwhere = " (arc.title like '%$keyword%') ";
// 如果typeid不为0,则增加栏目条件
if($typeid > 0) {
$orwhere .= " AND arc.typeid = '$typeid' ";
}
任务
修改文件
核心方法
修改搜索结果显示样式
templets/default/search.htm使用
{dede:field} 和 {dede:list} 等模板标签。
修改搜索结果排序方式
plus/search.php修改
$orderquery 变量的值。
修改搜索范围(如只搜标题)
plus/search.php修改
$orwhere 变量的 SQL 条件。
修改关键词高亮样式
plus/search.php修改
str_replace 中的高亮 HTML 标签。
创建高级搜索表单
自定义HTML表单 +
plus/search.php在表单中添加自定义字段(如
typeid),并在 search.php 中处理。search.htm 模板文件就足够满足大部分需求了,只有在需要改变搜索底层逻辑时,才需要谨慎地修改 search.php。
