- 使用织梦自带的搜索功能(推荐) - 这是最简单、最直接的方法,无需修改代码。
- 通过修改PHP源码实现 - 适用于需要更深度定制或希望搜索结果页URL更美观的场景。
下面我将详细介绍这两种方法。

使用织梦自带的搜索功能(推荐)
织梦的搜索功能本身就支持指定栏目,你只需要在搜索框所在的模板文件中,添加一个包含栏目选项的下拉菜单即可。
操作步骤:
-
定位搜索模板文件 找到你网站搜索页所使用的模板文件,通常这个文件位于
/templets/default/目录下,文件名可能是search.htm或search_list.htm,如果你使用了自定义模板,请找到你自己的搜索模板。 -
修改模板文件 用编辑器打开这个搜索模板文件,找到包含搜索表单的
<form>标签,通常它看起来是这样的:<form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php"> <div class="form"> <h4>搜索</h4> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" value="titlekeyword" /> <input name="q" type="text" class="search-keyword" id="search-keyword" /> <select name="typeid" id="typeid"> <option value='0' selected='1'>所有栏目</option> {dede:channel type='self' currentstyle="<option value='typeid' selected='1'>typename</option>"} <option value='typeid'>typename</option> {/dede:channel} </select> <button type="submit" class="search-submit">搜索</button> </div> </form> -
理解关键代码
(图片来源网络,侵删){dede:channel type='self' ...}: 这是织梦的栏目列表标签。type='self': 表示只获取当前栏目及其所有子栏目,如果你想在全站搜索时显示所有顶级栏目,可以改为type='top'。currentstyle: 这是当前选中栏目的样式,当用户选择的栏目和这个标签循环到的栏目一致时,会使用这个HTML代码,这里我们让它自动selected。<option value='typeid'>typename</option>: 这是循环出来的每一个栏目的HTML选项。typeid和typename会被自动替换为栏目的ID和名称。
<input type="hidden" name="searchtype" value="titlekeyword" />: 这个隐藏字段指定了搜索范围,titlekeyword表示只搜索文章标题和关键字,你也可以改为keyword只搜索关键字,或者去掉这个字段让它搜索所有内容。
-
如何指定默认栏目(可选) 如果你希望默认就选中某个或某几个栏目,可以在
<select>标签里手动添加<option>并设置selected属性。<select name="typeid" id="typeid"> <!-- 默认选中“公司简介”和“产品中心” --> <option value='0'>所有栏目</option> <option value='1' selected>公司简介</option> <option value='2' selected>产品中心</option> <!-- 下面用标签自动加载其他栏目 --> {dede:channel type='self' currentstyle="<option value='typeid' selected='1'>typename</option>"} <option value='typeid'>typename</option> {/dede:channel} </select>注意:直接在模板里写死
selected可能会和标签的currentstyle冲突,更稳妥的方法是,如果你只想让用户从这几个栏目中选择,就只列出这几个栏目,而不是用{dede:channel}标签来循环所有栏目。你只想让用户在“新闻中心”和“产品展示”中选择:
<select name="typeid" id="typeid"> <option value='0'>所有栏目</option> <option value='5'>新闻中心</option> <option value='6'>产品展示</option> </select>
-
保存并更新 保存修改后的模板文件,然后刷新你的网站搜索页面,就能看到下拉菜单了,用户选择栏目后点击搜索,结果就会限定在该栏目及其子栏目内。
通过修改PHP源码实现
这种方法可以让你实现更灵活的控制,比如在搜索结果页的URL中直接包含栏目ID,并且不依赖模板中的表单。
操作步骤:
-
修改搜索处理文件 打开织梦根目录下的
/plus/search.php文件。 -
添加栏目ID获取逻辑 在文件的开头部分,找到获取
typeid的代码,默认情况下,它可能只从POST请求中获取,我们需要让它也能从GET请求中获取,以便支持URL形式的搜索。找到类似这样的代码(大约在第30-40行):
//增加按栏目搜索 if($typeid > 0) { $typeid = GetSonIds($typeid); $addsql .= " And (arc.typeid in ($typeid) OR arc.typeid2 in ($typeid))"; }在这行代码之前,添加以下代码来获取URL中的
typeid参数:// 从GET请求中获取typeid,用于URL形式的搜索,如 search.php?q=关键词&typeid=5 if(empty($typeid) && isset($_GET['typeid'])) { $typeid = intval($_GET['typeid']); }这样,搜索功能现在既支持表单提交(
POST),也支持URL直接访问(GET)。 -
修改搜索结果页模板 打开你的搜索结果页模板,通常是
/templets/default/search.htm。 -
添加栏目筛选链接 在模板中,你可以添加一些链接,让用户可以直接点击来搜索特定栏目,你可以这样写:
<div class="channel-filter"> <span>按栏目筛选:</span> <a href="{dede:global.cfg_cmspath/}/plus/search.php?q={dede:global name='keyword'/}">所有栏目</a> <a href="{dede:global.cfg_cmspath/}/plus/search.php?q={dede:global name='keyword'/}&typeid=5">新闻中心</a> <a href="{dede:global.cfg_cmspath/}/plus/search.php?q={dede:global name='keyword'/}&typeid=6">产品展示</a> </div>解释:
{dede:global.cfg_cmspath/}: 获取网站的根目录路径。{dede:global name='keyword'/}: 获取当前搜索的关键词。&typeid=5: 这部分就是我们添加的参数,5是你想要搜索的栏目ID。
-
保存并测试 保存修改后的两个文件(
search.php和search.htm),当用户通过URL.../plus/search.php?q=织梦&typeid=5访问时,就会只搜索栏目ID为5及其子栏目中的内容。
总结与建议
| 特性 | 方法一 (模板修改) | 方法二 (修改PHP) |
|---|---|---|
| 实现难度 | 简单,只需懂HTML | 中等,需要修改PHP代码 |
| 灵活性 | 一般,依赖表单 | 高,支持URL直接访问 |
| 适用场景 | 常规网站,用户通过表单搜索 | 需要生成特定搜索链接、API调用等高级场景 |
| 维护性 | 模板修改,升级可能覆盖 | 源码修改,升级时需注意重新修改 |
对于绝大多数网站,强烈推荐使用方法一,它简单、安全,且符合织梦的设计逻辑,只有在有特殊需求,比如需要生成可分享的、带栏目筛选的搜索链接时,才考虑使用方法二。
