帝国 CMS 多条件搜索完整实战案例|栏目 + 自定义字段 + 关键词联动筛选
时间:2026-08-28 12:51:00 来源:aliz.cn 作者:SKY 阅读:
前言
帝国 CMS 自带的普通搜索功能比较单薄,大多时候只能依靠标题关键词进行搜索。在项目开发中,像产品库、房源信息、人才招聘、企业黄页这类栏目,往往需要多个筛选条件同时查询:栏目分类、地区、价格区间、自定义字段、发布时间、是否推荐等。
原生搜索不支持多字段联动筛选,很多新手不知道该如何改造。本文给大家一套完整可落地的多条件搜索实战案例,包含搜索表单模板、搜索接收处理代码、搜索结果列表展示,不需要安装第三方插件。
适配版本:帝国 CMS 7.5 / 8.0
一、实现原理说明
帝国 CMS 高级搜索本质就是拼接where查询条件。
- 前台表单提交多个筛选参数(栏目 ID、地区、关键词等)
- 后台接收参数,判断参数是否为空,不为空就追加 SQL 条件
- 使用
sys_ShowMoreData灵动标签或者selectSQL 查询输出结果
⚠️安全提醒:接收参数一定要做过滤,防止 SQL 注入漏洞。
二、前台多条件搜索表单模板代码
新建搜索页面模板或者放在首页、列表页,表单提交地址为 /e/search/index.php
<form action="/e/search/index.php" method="get">
<!-- 搜索模型ID,填写你栏目对应的模型id -->
<input type="hidden" name="mid" value="1">
<input type="hidden" name="myorder" value="0">
<input type="hidden" name="tempid" value="1">
<div>
<label>关键词:</label>
<input type="text" name="keyboard" placeholder="输入标题关键词">
</div>
<div>
<label>所属栏目:</label>
<select name="classid">
<option value="">全部栏目</option>
<option value="12">建站教程</option>
<option value="13">服务器运维</option>
<option value="14">SEO优化</option>
</select>
</div>
<div>
<label>地区筛选:</label>
<select name="dz">
<option value="">不限地区</option>
<option value="广东">广东</option>
<option value="北京">北京</option>
<option value="上海">上海</option>
</select>
</div>
<div>
<label>价格最低:</label>
<input type="number" name="minprice" value="">
<label>价格最高:</label>
<input type="number" name="maxprice" value="">
</div>
<div>
<button type="submit">开始搜索</button>
</div>
</form>
参数说明
mid:数据表模型 IDtempid:搜索结果使用的模板 ID,后台搜索模板管理新建classid:筛选指定栏目文章dz、minprice、maxprice为你后台新建的自定义字段
三、新建搜索结果模板(核心:多条件灵动标签)
后台‑模板管理‑搜索模板,新建搜索结果模板,放入下面灵动标签代码
[e:searchloop select="*" table="phome_ecms_news" where="" order="newstime desc" tempvar="0"]
<ul>
<li>
<a href="<?=$bqsr['titleurl']?>"><?=$bqsr['title']?></a>
<p>栏目:<?=$bqsr['classname']?></p>
<p>地区:<?=$bqsr['dz']?></p>
<p>价格:<?=$bqsr['price']?></p>
<p>发布时间:<?=date('Y‑m‑d',$bqsr['newstime'])?></p>
</li>
</ul>
[/e:searchloop]
<!--分页-->
<?=$searchpage?>
上面这种方式只能用系统自带字段筛选。如果需要自定义字段高级多条件拼接,推荐使用 SQL 自定义查询方案。
四、高阶方案:自定义多条件 SQL 搜索(自由组合筛选)
适合复杂多条件、区间筛选、多字段同时筛选场景。
1、搜索表单提交到自定义处理页面
新建文件 /e/search/msearch.php,用来接收搜索参数,拼接查询条件
<?php
require('../../class/connect.php');
require('../../class/db_sql.php');
$link=db_connect();
$empire=new mysqlquery();
//接收参数并过滤
$key=RepPostStr($_GET['key']);
$classid=(int)$_GET['classid'];
$dz=RepPostStr($_GET['dz']);
$minprice=(int)$_GET['minprice'];
$maxprice=(int)$_GET['maxprice'];
$where='1=1';
//关键词条件
if(!empty($key)){
$where.=" and title like '%$key%'";
}
//栏目条件
if($classid>0){
$where.=" and classid='$classid'";
}
//地区字段条件
if(!empty($dz)){
$where.=" and dz='$dz'";
}
//价格区间筛选
if($minprice>0){
$where.=" and price >= '$minprice'";
}
if($maxprice>0){
$where.=" and price <= '$maxprice'";
}
//执行查询
$sql=$empire->query("select * from {$dbtbpre}ecms_news where $where order by newstime desc limit 20");
?>
<!--输出搜索结果页面html-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf‑8">
<title>多条件搜索结果</title>
</head>
<body>
<h2>搜索结果列表</h2>
<ul>
<?php
while($r=$empire->fetch($sql)){
?>
<li>
<a href="<?=$r['titleurl']?>"><?=$r['title']?></a>
<div>地区:<?=$r['dz']?>|价格:<?=$r['price']?></div>
</li>
<?php } ?>
</ul>
</body>
</html>
<?php
db_close();
$empire=null;
?>
表单提交地址修改为:
<form action="/e/search/msearch.php" method="get">
五、URL 伪静态优化(搜索结果美化)
Nginx 搜索伪静态示例,可将搜索长地址转为好看 URL
rewrite ^/search‑(.*)‑(.*)\.html$ /e/search/index.php?keyboard=$1&classid=$2 last;
六、常见坑点以及问题排查清单
- 自定义字段搜索查不到结果 原因:自定义字段没有勾选【作为可搜索字段】。后台模型管理‑字段设置开启搜索。
- 多条件同时筛选无效 检查 SQL 拼接条件,
and不要重复、不要漏空格。 - SQL 注入安全风险 所有 GET 参数必须用
RepPostStr()、(int)函数过滤,不要直接带入 SQL 语句。 - 搜索分页失效 自定义搜索页面分页需要引入帝国分页函数
page1()。
七、进阶拓展方向
- 多选标签筛选(checkbox 多选项同时查询)
- 联动下拉(一级地区‑二级城市二级联动)
- 价格区间滑块筛选
- AJAX 无刷新多条件筛选,不需要刷新页面
结语
帝国 CMS 多条件搜索不用每次都依赖付费插件。掌握前台表单 + SQL 条件拼接的思路,就可以实现栏目、关键词、自定义字段、区间价格等几乎所有筛选需求,非常适合产品库、资源下载站、信息分类站点开发。
本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载
发表评论
共有0条评论