要实现搜索自定义字段,你需要修改几个核心文件,这个过程需要你对织梦的文件结构有一定了解,并且建议在修改前备份你的网站。

下面我将为你提供两种方法:
-
直接修改核心文件(适用于所有自定义字段)
- 优点:功能最完整,可以搜索所有类型的自定义字段(文本、数字、下拉、多选等)。
- 缺点:直接修改核心文件,升级织梦时可能会被覆盖,需要重新修改。
-
使用官方“高级搜索”模块(适用于特定字段)
- 优点:官方模块,比较稳定,无需修改核心文件,适合制作带筛选条件的搜索页面。
- 缺点:功能相对固定,灵活性不如方法一,且需要额外安装。
直接修改核心文件(推荐)
这个方法的核心思路是:修改处理搜索请求的PHP文件,让它在构建SQL查询时,将你指定的自定义字段也包含进去。

假设你的自定义字段名为 yourfield。
步骤 1:修改 plus/search.php 文件
这是处理搜索请求的主入口文件,我们需要在这里修改SQL查询的构建逻辑。
-
打开
/plus/search.php文件。 -
找到构建SQL查询的地方,通常在文件中下部,类似这样的代码:
(图片来源网络,侵删)// ... 其他代码 ... $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.money, arc.description,arc.pubdate,arc.senddate,arc.arcrank,arc.click, arc.litpic,channel.addtable FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id LEFT JOIN `{$addtable}` ON arc.id = {$addtable}.aid WHERE {$orlike} $typeid $orderQuery $limit"; // ... 其他代码 ... -
修改
LEFT JOIN部分:- 默认情况下,它只关联了
dede_archives和你模型对应的附加表({$addtable})。 - 如果你的自定义字段在附加表里,这部分通常不需要改,如果你的字段在主表
dede_archives,这里也不需要改。
- 默认情况下,它只关联了
-
修改
WHERE子句(最关键的一步):- 找到
$orlike变量的定义,它通常是一个OR连接的字符串,用于在标题和正文中搜索。 - 在
$orlike的基础上,加上你的自定义字段。
修改前(示例):
// $orlike 可能是这样的 $orlike = " (arc.title LIKE '%$keyword%') "; // 或者更复杂的 $orlike = " (arc.title LIKE '%$keyword%' OR arc.body LIKE '%$keyword%') ";
修改后(示例): 假设你想在
yourfield这个自定义字段中也搜索,并且它位于附加表中。// 在原有的 $orlike 基础上,添加你的自定义字段 // 注意:字段名前要加上附加表的别名,通常是 'a'(取决于你的SQL) $orlike = " (arc.title LIKE '%$keyword%' OR arc.body LIKE '%$keyword%' OR a.yourfield LIKE '%$keyword%') ";
完整代码示例: 假设你的
search.php文件中相关部分如下,你需要修改$orlike的赋值语句。// ... 前面的代码 ... // 1. 获取附加表名 if($typeid > 0){ $typeid = GetSonIds($typeid, $channelid); } $addtable = $arc->addtable; // 2. 构建搜索关键词条件 (这是需要修改的核心) // 默认只搜索标题和body $orlike = " (arc.title LIKE '%$keyword%' OR arc.body LIKE '%$keyword%') "; // ======== 在这里添加你的自定义字段搜索 ========= // 假设你的自定义字段 'yourfield' 在附加表中,附加表别名为 'a' $orlike .= " OR a.yourfield LIKE '%$keyword%' "; // =============================================== // 3. 构建完整的SQL查询 $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.money, arc.description,arc.pubdate,arc.senddate,arc.arcrank,arc.click, arc.litpic,channel.addtable FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id LEFT JOIN `{$addtable}` a ON arc.id = a.aid WHERE {$orlike} $typeid $orderQuery $limit"; // ... 后面的执行查询代码 ... - 找到
步骤 2:修改 include/arc.searchview.class.php 文件
这个文件负责处理搜索结果页的显示逻辑,为了让搜索结果页能正确显示你的自定义字段,你需要修改 GetResultList() 函数。
-
打开
/include/arc.searchview.class.php文件。 -
找到
GetResultList()函数。 -
在函数内,找到构建SQL查询的地方,同样需要将你的自定义字段加入到
SELECT语句中。修改前(示例):
// 在 GetResultList 函数中 $fields = 'arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule, tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath'; $query = "SELECT $fields FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id WHERE $query";修改后(示例): 将你的自定义字段
yourfield添加到$fields变量中。// 在 GetResultList 函数中 // 将你的自定义字段 a.yourfield 添加到字段列表 $fields = 'arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule, tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath, a.yourfield'; $query = "SELECT $fields FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id LEFT JOIN `{$this->AddTable}` a ON arc.id = a.aid WHERE $query";注意:这里使用了
{$this->AddTable}来获取附加表名,这是更规范的做法。
步骤 3:在搜索结果模板中调用自定义字段
-
打开你的搜索结果模板文件,通常位于
/templets/default/search.htm。 -
在你需要显示自定义字段的地方,使用织梦的标签
{dede:field.yourfield /}来调用。<div class="result-item"> <h3><a href="[field:arcurl/]">[field:title/]</a></h3> <p class="summary">[field:description function='cn_substr(@me,100)'/]...</p> <!-- 在这里添加你的自定义字段显示 --> <p class="custom-field">自定义字段内容:{dede:field.yourfield/}</p> </div>
步骤 4:清理缓存
完成所有修改后,务必进入织梦后台的【系统】->【一键更新网站】->【更新缓存】,然后更新一下搜索页面,才能看到效果。
使用官方“高级搜索”模块
这个方法不修改核心代码,而是利用织梦自带的“高级搜索”功能,它天生就支持对自定义字段进行搜索和筛选。
-
安装模块:
- 登录织梦后台,进入【模块】->【模块管理】。
- 点击“上传新模块”,找到织梦安装目录下的
/plus/advancedsearch.php文件,上传并安装。 - 或者,如果你的织梦是完整版,这个模块可能已经存在,直接在“模块列表”中启用即可。
-
创建搜索页面:
-
进入【核心】->【内容模型管理】,选择你想要添加搜索功能的模型(文章模型”)。
-
在模型管理页面,点击“高级搜索”或类似的按钮,系统会引导你生成一个高级搜索页面。
-
或者,你也可以手动创建一个页面,在页面内容中插入以下标签:
{dede:global name='keyword' function='RemoveXSS(@me)'/} {dede:php} $formurl = $cfg_cmspath.'/plus/advancedsearch.php'; $typeid = isset($_GET['typeid']) ? intval($_GET['typeid']) : 0; $channeltype = isset($_GET['channeltype']) ? intval($_GET['channeltype']) : 0; $searchtype = isset($_GET['searchtype']) ? trim($_GET['searchtype']) : 'title'; $keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : ''; $orderby = isset($_GET['orderby']) ? trim($_GET['orderby']) : 'default'; $mid = isset($_GET['mid']) ? intval($_GET['mid']) : 0; // 这里可以输出搜索表单 echo "<form name='search' action='{$formurl}' method='get'>"; echo "关键词:<input type='text' name='keyword' value='{$keyword}'>"; // 其他表单元素... echo "<input type='submit' value='搜索'>"; echo "</form>"; {/dede:php} {dede:sql sql="SELECT * FROM `dede_advancedsearch` WHERE aid=1"} 这里会加载你配置好的高级搜索表单 {/dede:sql}更简单的方式是直接访问
plus/advancedsearch.php页面,系统会自动生成一个包含所有自定义字段的搜索表单。
-
-
配置自定义字段:
- 访问你创建的高级搜索页面,你会看到所有你在模型中设置的自定义字段(文本框、下拉框、复选框等)。
- 用户可以直接在这些字段中输入内容或进行选择,然后进行搜索。
-
显示搜索结果:
- 高级搜索提交后,结果会默认显示在
plus/advancedsearch.php页面。 - 你可以复制
plus/advancedsearch.php文件,重命名(如my_search.php),然后修改其中的模板部分,来定制自己的搜索结果页样式。
- 高级搜索提交后,结果会默认显示在
总结与建议
| 特性 | 方法一 (修改核心文件) | 方法二 (高级搜索模块) |
|---|---|---|
| 适用场景 | 需要将自定义字段搜索集成到站内全局搜索框中。 | 需要一个独立的、带筛选条件的搜索页面。 |
| 优点 | 功能强大,无缝集成,搜索范围广。 | 官方支持,安全稳定,无需改核心,界面友好。 |
| 缺点 | 修改核心文件,升级有风险,代码稍复杂。 | 功能相对固定,需要额外页面,不适合全局搜索。 |
| 推荐度 | ⭐⭐⭐⭐⭐ (对于需要此功能的开发者) | ⭐⭐⭐⭐⭐ (对于普通用户和快速部署) |
对于大多数用户,方法二是更安全、更简单的选择,如果你需要将自定义字段完全融入织梦的全局搜索体验(比如顶部搜索框),那么方法一是必经之路。
希望这个详细的教程能帮到你!如果在操作中遇到问题,可以再提出。
