- 修改搜索程序文件:让搜索逻辑包含自定义字段。
- 修改搜索结果模板文件:在搜索结果页中调用并显示自定义字段。
- (可选)修改搜索表单:让前端搜索框可以指定搜索特定字段。
下面我将为你提供详细的图文步骤说明。

准备工作:添加一个自定义字段
为了演示,我们先在后台给文章模型添加一个自定义字段,video_url”(视频链接)。
- 登录织梦后台。
- 进入「核心」 -> 「内容模型管理」。
- 找到并点击你正在使用的模型,通常是“文章”模型,然后点击“更改”。
- 在模型字段设置中,点击“添加新字段”。
- 填写字段信息:
- 字段名:
video_url(必须使用英文小写,不要有空格) - 字段类型: 选择“单行文本”
- 字段提示: “视频链接”
- 前台显示勾选: 勾选此项,这样在前台发布文章时才会显示这个字段。
- 字段名:
- 保存设置。
- 现在去发布一篇新文章,你就会看到多了一个“视频链接”的输入框,填入一些测试内容,
https://example.com/video.mp4。
第一步:修改搜索程序文件 (search.php)
这是最关键的一步,我们需要修改搜索的核心逻辑,让它去查询我们的自定义字段。
-
找到文件: 使用FTP或你的主机控制面板,找到并下载
/plus/search.php文件。 -
定位代码: 在
search.php文件中,找到以下这段代码(通常在第30行左右):
(图片来源网络,侵删)$typeid = (isset($typeid) && is_numeric($typeid)) ? $typeid : 0; //搜索关键词处理 $keyword = isset($keyword) ? trim(FilterSearch($keyword)) : ''; if ($keyword == '') { ShowMsg('关键字不能为空!', '-1'); exit(); } -
修改代码: 在这段代码的下面,添加如下代码,这段代码的作用是获取当前模型的所有自定义字段名。
// 获取当前模型的自定义字段名 $addFieldSql = "SELECT `e`.`maintable` FROM `dede_arctype` AS `t` LEFT JOIN `dede_channeltype` AS `e` ON `t`.`channeltype`=`e`.`id` WHERE `t`.`id` = $typeid"; $addFieldRow = $dsql->GetOne($addFieldSql); $addFieldNames = array(); if (is_array($addFieldRow) && !empty($addFieldRow['maintable'])) { $tableFields = $dsql->GetFields($addFieldRow['maintable']); foreach ($tableFields as $field) { // 排除系统默认字段,只取自定义字段 if (!in_array($field['Field'], array('id', 'typeid', 'arcrank', 'channel', 'senddate', 'sortrank', 'mid', 'click', 'money', 'title', 'shorttitle', 'description', 'keywords', 'templet', 'userip', 'filename', 'dutyadmin', 'ismake', 'channeltype', 'image', 'litpic', 'pubdate', 'adminid', 'ismobile', 'typeoptions', 'relatedlinks', 'pagestyle', 'body', 'mtype', 'lastpost', 'tag')) { $addFieldNames[] = $field['Field']; } } } -
修改SQL查询语句: 继续向下翻,找到执行数据库查询的SQL语句,它看起来像这样:
$query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.channel,arc.arcrank,arc.click,arc.litpic,arc.senddate,arc.mid,arc.memberid FROM `dede_archives` arc WHERE {$addquery} $anduser ORDER BY arc.sortrank DESC";这段代码只是查询了主表
dede_archives,我们需要修改它,让它也去查询附加表(存储自定义字段的表)。将上述查询代码替换为以下代码:
// 构建查询附加表的SQL $addsql = ''; if (!empty($addFieldNames)) { foreach ($addFieldNames as $field) { // 将每个自定义字段都加入到搜索条件中 $addsql .= " OR arc.addtable LIKE '%".$field."%'"; } } // 修改主查询,让它包含附加表中的内容 $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.channel,arc.arcrank,arc.click,arc.litpiC,arc.senddate,arc.mid,arc.memberid FROM `dede_archives` arc WHERE {$addquery} $anduser AND (1=1 " . $addsql . " ) ORDER BY arc.sortrank DESC";注意:上面的
arc.litpiC应该是arc.litpic,这里只是展示一个拼写错误的可能性,请确保你的代码是正确的。 -
保存文件: 将修改好的
search.php文件上传回服务器,覆盖原文件。
原理说明:
- 我们首先获取了当前模型的所有自定义字段名。
- 我们构建了一个
OR条件,将这些字段名加入到SQL的WHERE子句中,虽然LIKE '%field%'这种方式不是最高效的,但它能确保搜索程序会去扫描附加表的结构,从而找到包含关键词的记录。 - 更高级的做法是直接操作附加表,但这种方法相对简单,且能满足大多数需求。
第二步:修改搜索结果模板文件 (search.htm)
现在搜索功能已经可以找到包含自定义字段内容的文章了,但我们还需要在结果页上把它显示出来。
-
找到文件: 进入后台「模板」 -> 「模板管理」 -> 「默认模板目录」 -> 「plus」。 找到并下载
search.htm文件。 -
定位代码: 在
search.htm中,找到循环显示搜索结果的部分,通常是一个{dede:list}或{dedarclist}标签。<div class="listbox"> {dede:list pagesize='10'} <li> <span class="title"><a href="[field:arcurl/]">[field:title/]</a></span> <span class="info">([field:pubdate function="MyDate('Y-m-d',@me)"/])</span> </li> {/dede:list} </div> -
添加自定义字段调用: 在
{dede:list}标签内部,你希望显示自定义字段的位置,添加以下代码:<div class="listbox"> {dede:list pagesize='10'} <li> <h3><a href="[field:arcurl/]">[field:title/]</a></h3> <p class="intro">[field:description/]...</p> <!-- ====== 在这里添加自定义字段的调用 ====== --> <p class="custom-field"> 视频链接:<a href="[field:video_url/]" target="_blank">观看视频</a> </p> <!-- ======================================== --> <div class="info">发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"] | 点击:[field:click/]</div> </li> {/dede:list} </div>[field:video_url/]就是调用我们第一步中创建的自定义字段。字段名必须和后台设置的字段名完全一致。- 你可以根据需要,为这个字段添加CSS样式,让它在页面上更美观。
-
保存文件: 将修改好的
search.htm文件上传回服务器,覆盖原文件。
第三步:(可选)修改搜索表单,实现字段筛选
我们希望用户可以直接选择搜索“标题”还是“自定义字段内容”,这需要修改搜索表单和 search.php。
-
修改搜索表单: 在你的网站搜索框所在的模板文件(如
head.htm)中,将普通的搜索表单修改为带下拉选择框的表单。<form name="formsearch" action="/plus/search.php"> <input type="hidden" name="kwtype" value="0" id="kwtype" /> <select name="searchtype" id="searchtype"> <option value="title" selected>搜索标题</option> <option value="body">搜索内容</option> <option value="video_url">搜索视频链接</option> <!-- 新增 --> </select> <input type="text" name="q" id="q" /> <button type="submit">搜索</button> </form> -
修改
search.php: 在search.php中,找到处理$keyword的地方,根据searchtype的值来构建不同的查询条件。// ... (前面的代码不变) ... $keyword = isset($keyword) ? trim(FilterSearch($keyword)) : ''; if ($keyword == '') { ShowMsg('关键字不能为空!', '-1'); exit(); } // 获取搜索类型 $searchtype = isset($searchtype) ? trim($searchtype) : 'title'; // 根据搜索类型构建查询条件 $addquery = " arc.title LIKE '%$keyword%' "; if ($searchtype == 'body') { $addquery = " arc.body LIKE '%$keyword%' "; } elseif ($searchtype == 'video_url') { // 这里假设你的自定义字段在 dede_addonarticle 表中 // 注意:如果你的附加表名不是这个,需要修改 $addquery = " EXISTS (SELECT 1 FROM dede_addonarticle WHERE aid = arc.id AND video_url LIKE '%$keyword%') "; } // ... (后面的代码保持不变) ...注意:这种直接拼接SQL的方式存在SQL注入风险,在实际生产环境中,你应该使用
$dsql->SetQuery()和$dsql->Execute()等更安全的方式来执行查询,但对于一个简单的自定义功能,这种方式可以快速实现。
总结与注意事项
- 步骤顺序:务必按照“修改程序 -> 修改模板”的顺序进行。
- 文件备份:在修改任何核心文件(如
search.php)之前,请务必备份原文件,以防出错。 - 缓存问题:修改模板后,如果看不到效果,请去后台清理一下“模板缓存”。
- 字段名大小写:调用自定义字段时
[field:video_url/]的video_url必须和后台设置的字段名完全一致,包括大小写。 - 效率问题:修改
search.php的方法会增加数据库查询的负担,如果你的网站数据量非常大,可能会导致搜索变慢,对于大型网站,建议考虑使用更专业的全文搜索引擎(如Elasticsearch)来替代织梦的默认搜索。
通过以上步骤,你就可以成功地在织梦CMS的搜索结果中显示自定义字段了。
