- 搜索页面模板文件 (
search.php):用于添加模型选择的下拉菜单。 - 搜索处理程序文件 (
plus/search.php):用于接收模型选择参数,并修改搜索逻辑。
操作步骤详解
第一步:修改搜索页面模板 (search.php)
这个文件是用户在网站上看到的搜索框所在的页面,我们需要在这里添加一个 <select> 下拉菜单,让用户可以选择内容模型。

-
定位文件 登录你的 DedeCMS 后台,在
/templets/default/目录下找到search.php文件,如果你的网站使用了其他模板,请在你自己的模板目录下寻找。 -
找到搜索表单 在
search.php文件中,找到包含搜索输入框<input type="text">的<form>表单,通常代码看起来像这样:<form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php" method="get"> <div class="form-search"> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" value="titlekeyword" /> <input type="text" name="q" class="input-text" placeholder="请输入搜索关键词"> <button type="submit" class="btn">搜索</button> </div> </form> -
添加模型选择下拉菜单 在
<input type="text">输入框和<button>按钮之间,添加一个<select>下拉菜单,为了动态获取所有模型,我们需要使用 DedeCMS 的标签{dede:channel}。修改后的代码示例:
(图片来源网络,侵删)<form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php" method="get"> <div class="form-search"> <!-- 原有的隐藏字段,可以保留或根据需要修改 --> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" value="titlekeyword" /> <!-- 添加模型选择下拉菜单 --> <select name="channeltype" id="channeltype" style="width: 120px; margin-right: 10px;"> <option value="0">全部模型</option> <!-- 这里使用 dede:channel 标签来循环出所有内容模型 --> <!-- typeid='top' 表示只获取顶级栏目,即内容模型 --> <!-- noself='yes' 表示不包含当前栏目(这里不适用,但可以防止一些意外) --> {dede:channel type='self' row='10' noself='yes'} <option value="[field:id/]">[field:typename/]</option> {/dede:channel} </select> <input type="text" name="q" class="input-text" placeholder="请输入搜索关键词"> <button type="submit" class="btn">搜索</button> </div> </form>代码解释:
<select name="channeltype">:我们给这个下拉菜单命名为channeltype,这个名字非常重要,我们将在plus/search.php中使用它。<option value="0">全部模型</option>:提供一个默认选项,value="0"代表搜索所有模型。{dede:channel ...}:这是一个 DedeCMS 的循环标签,它会从数据库中读取所有内容模型(顶级栏目)。[field:id/]:获取模型的 ID,作为<option>的value值。[field:typename/]:获取模型的名称,作为显示给用户看的内容。
-
保存并上传 修改完成后,保存
search.php文件并上传到你的服务器/templets/default/目录下,你的搜索页面就已经有了模型选择的下拉菜单。
第二步:修改搜索处理程序 (plus/search.php)
这个文件是处理搜索请求的 PHP 脚本,我们需要修改它,使其能够识别用户选择的 channeltype,并只在该模型对应的栏目中进行搜索。
-
定位文件 通过 FTP 或文件管理器,进入网站的
/plus/目录,找到search.php文件。
(图片来源网络,侵删) -
找到并修改 SQL 查询语句 在
search.php文件中,找到执行数据库查询的核心代码,通常在一个if条件判断中,if($typeid > 0),我们需要修改的是构建arc.typeid条件的 SQL 语句。原始代码(大概位置): 你需要找到类似下面这样的代码段,特别是
$addquery这个变量。// ... 其他代码 ... if($typeid > 0) { $typeid = GetSonIds($typeid); $addquery = " And arc.typeid in($typeid) "; } // ... 其他代码 ... $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 1=1 $addquery $ordersql limit $startrow,$pagesize"; // ... 其他代码 ... -
添加模型判断逻辑 我们需要在
$typeid的判断之后,增加一个对channeltype的判断。channeltype不为 0,我们就构建一个新的查询条件。修改后的代码示例: 在
if($typeid > 0)的if语句之后,else语句之前(如果没有else,就直接在if语句后面),添加如下代码:// ... 其他代码 ... // 原有的 typeid 判断 if($typeid > 0) { $typeid = GetSonIds($typeid); $addquery = " And arc.typeid in($typeid) "; } // 新增的 channeltype 判断 else if(!empty($channeltype) && $channeltype != 0) { // 获取该模型下的所有栏目ID $channeltype = GetSonIds($channeltype); $addquery = " And arc.typeid in($channeltype) "; } // ... 其他代码 ... // 最终的查询语句保持不变,$addquery 会根据上面的逻辑被正确赋值 $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 1=1 $addquery $ordersql limit $startrow,$pagesize"; // ... 其他代码 ...代码解释:
else if(!empty($channeltype) && $channeltype != 0):这个判断的含义是:“$channeltype变量存在,并且它的值不等于 0(即不是‘全部模型’选项)”。$channeltype = GetSonIds($channeltype);:GetSonIds()是 DedeCMS 的一个核心函数,用于获取一个栏目及其所有子栏目的 ID,这里我们用它来获取用户选择的模型(它本身是一个顶级栏目)下的所有栏目 ID。$addquery = " And arc.typeid in($channeltype) ";:构建 SQL 查询的WHERE条件,这条语句的意思是,只搜索arc.typeid(文章的栏目ID)在$channeltype(模型下的所有栏目ID)列表中的文章。
-
保存并上传 修改完成后,保存
plus/search.php文件并上传到服务器的/plus/目录下。
完成!
你已经成功地为 DedeCMS 的搜索功能添加了“指定内容模型”的能力。
测试流程:
- 访问你的搜索页面 (
search.php)。 - 在下拉菜单中选择一个内容模型(产品”)。
- 在搜索框中输入一个关键词,并点击搜索。
- 查看搜索结果,你会发现结果中只包含了属于“产品”模型及其子栏目的内容。
如果选择“全部模型”,则会进行全局搜索,与原来一样。
注意事项
- 备份数据:在修改任何核心文件之前,请务必备份原始的
search.php文件,以防出错可以快速恢复。 - 权限问题:确保你的服务器对
/plus/search.php文件有写入权限,以便上传修改后的文件。 - 模板引擎:如果你的网站开启了模板编译缓存,修改
search.php模板后可能需要清空缓存才能看到效果。 - 代码兼容性:以上代码是基于 DedeCMS 5.7 版本的经典内核,如果你使用的是更早或更晚的版本,代码行号可能会有差异,但核心逻辑是相同的,请根据你实际的文件结构进行调整。
