下面我将从最常见的原因到解决方案,再到进阶自定义,为你详细拆解这个问题。

核心原因:搜索页的执行流程
要解决问题,首先要明白为什么普通标签在搜索页失效。
-
页 (如
article_articlelist.htm):- 用户访问一个栏目页或文章页。
- Dedecms 系统根据 URL 中的 ID(如
arcid=123或typeid=45)去数据库查询对应的数据。 - 然后将这些数据一次性加载到模板中,标签如
{dede:field.title/}、{dede:field.body/}等直接从已加载的数据里读取并显示。
-
搜索页 (
search.php+search.htm):- 用户在搜索框输入关键词,点击搜索,访问
search.php?keyword=你的关键词。 search.php脚本被触发,它接收keyword参数。- 关键步骤:
search.php会在数据库中执行LIKE '%关键词%'这样的查询,找到所有匹配的文章。 - 它将查询结果(一个文章ID的列表)传递给搜索模板
search.htm。 - 在
search.htm中,你看到的{dede:list}或{dede:arclist}标签,其作用域不是全站所有文章,而是仅限于search.php传递过来的这个“搜索结果集”。
- 用户在搜索框输入关键词,点击搜索,访问
搜索页的标签之所以“没作用”,往往是因为你试图用标签去获取文章本身的字段(如 {dede:field.title/}),但搜索页模板的核心是循环显示一个动态的、由关键词筛选出的结果列表。

最常见的错误及解决方案
问题1:使用了错误的标签来显示搜索结果
错误示例:
在 search.htm 中直接使用:
{dede:field.title/}
这几乎肯定无法工作,因为 search.php 传递给模板的主要数据是“结果列表”,而不是单个文章的详细字段。
正确做法:
使用列表标签来循环遍历搜索结果,在织梦搜索页,最常用的是 {dede:list}。
正确示例 (search.htm 模板代码):

<html>
<head>搜索结果-{dede:global name='keyword'/} - {dede:global.cfg_webname/}</title>
</head>
<body>
<h1>搜索关键词:"{dede:global name='keyword'/}" 的结果</h1>
{dede:list pagesize='10'}
<div class="result-item">
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:description function='cn_substr(@me,200)'/]...</p>
<div class="info">发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"/] 来源:[field:source/] 点击:[field:click/]</div>
</div>
{/dede:list}
<!-- 分页标签 -->
<div class="page">
{dede:pagelist listsize='4' listitem='info,index,end,pre,next,pageno'}
{/dede:pagelist}
</div>
</body>
</html>
标签解释:
{dede:global name='keyword'/}: 获取用户搜索的关键词,这是搜索页最常用的全局变量。{dede:list}: 循环输出搜索结果,它的行为和普通列表页的{dede:list}一样,但数据源被search.php限制为搜索结果。[field:title/],[field:arcurl/],[field:description/]: 这些是{dede:list}内部的字段标签,用于获取当前循环中这篇文章的标题、链接、摘要等。{dede:pagelist}: 输出分页导航,搜索结果通常很多,分页是必须的。
问题2:{dede:list} 没有输出任何内容
如果你用了 {dede:list} 但什么都没显示,原因通常是:
-
没有匹配的结果:最简单的原因,数据库里根本没有包含你搜索关键词的文章。
- 解决方法:确认你的搜索关键词是存在的,并且发布文章时,标题、内容等字段确实包含了该词。
-
织梦搜索功能未开启或损坏:
- 解决方法:
- 登录织梦后台。
- 进入【系统】-> 【系统基本参数】。
- 在左侧菜单选择 【核心设置】。
- 找到 “是否开启全文搜索功能”,确保它被设置为“是”。
- 点击【保存】。
- 解决方法:
-
搜索索引表未生成或为空: 织梦的搜索依赖一个名为
dede_searchindex的数据表来存储索引,如果这个表是空的或损坏了,搜索就找不到结果。- 解决方法(重建索引):
- 登录织梦后台。
- 进入【系统】-> 【系统设置】 -> 【全站搜索设置】。
- 在这里你可以找到“重建搜索索引”的按钮或链接,点击它,系统会重新扫描所有文章并生成索引,这个过程可能需要一些时间,特别是文章很多的时候。
- 解决方法(重建索引):
问题3:需要调用文章的其他自定义字段
假设你的文章模型有自定义字段,如 writer(作者)、price(价格)等。
错误示例:
在 {dede:list} 循环外调用,或者使用了错误的标签。
<!-- 错误 -->
作者:{dede:field.writer/}
正确做法:
在 {dede:list} 的循环内部,使用 [field:自定义字段名/] 的形式调用。
正确示例:
{dede:list pagesize='10'}
<div class="result-item">
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>作者:[field:writer/]</p> <!-- 正确调用自定义字段 -->
<p>价格:¥[field:price/]</p> <!-- 正确调用自定义字段 -->
<p>[field:description function='cn_substr(@me,200)'/]...</p>
</div>
{/dede:list}
进阶:自定义搜索页模板和逻辑
有时候默认的 search.php 和 search.htm 无法满足需求,比如你想根据不同栏目搜索,或者想修改搜索结果的排序方式,这时你需要修改PHP文件。
场景: 我想让搜索结果按“发布时间”倒序排列,而不是默认的相关度。
操作步骤:
-
备份文件:非常重要!请先备份
/plus/search.php文件。 -
修改
search.php: 用代码编辑器打开/plus/search.php,找到生成查询SQL语句的核心部分,通常在if($typeid > 0)这样的判断之后。 你会看到类似这样的代码:// ... 其他代码 ... $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} $typeidorder $ordersql LIMIT $startrow,$pagesize"; // ... 其他代码 ...你需要修改
$ordersql这个变量,默认的$ordersql可能是ORDER BY arc.id DESC。 你可以将其修改为:// 在生成 $query 之前,确保 $ordersql 被定义为按发布时间排序 // 找到类似 $ordersql = ''; 的行,并修改它 $ordersql = " ORDER BY arc.pubdate DESC "; // 按发布时间倒序 // 或者 // $ordersql = " ORDER BY arc.click DESC "; // 按点击量倒序
注意:修改SQL语句有风险,请确保你的SQL语法正确。
-
上传并测试:将修改后的
search.php文件上传到你的服务器,然后进行搜索测试。
总结排查清单
当你的织梦搜索页标签不工作时,请按以下顺序检查:
- 检查模板标签:确认在
search.htm中使用了{dede:list}和[field:*]标签来循环和显示结果,而不是直接使用{dede:field.*}。 - 检查关键词:确认搜索的关键词在数据库中确实存在。
- 检查搜索功能开关:后台【系统基本参数】->【核心设置】->“是否开启全文搜索功能”设为“是”。
- 重建搜索索引:后台【系统设置】->【全站搜索设置】->“重建搜索索引”。
- 检查自定义字段:如果需要调用自定义字段,确保在
{dede:list}循环内部使用[field:字段名/]。 - 检查模板文件:确保
search.htm文件存在于你的模板目录下,并且文件名正确。 - 检查缓存:清除浏览器缓存和织梦后台的缓存(【生成】->【更新系统缓存】)。
按照这个流程,90% 以上的搜索页标签问题都能得到解决,如果还有问题,请提供你的 search.htm 模板代码,以便更精确地定位问题。
