核心概念:多条件筛选的实现原理
无论使用哪种方法,多条件筛选的核心逻辑都是一样的:

-
URL参数传递:用户在前端页面上勾选了筛选条件(如分类、品牌、价格区间等),这些条件会以URL参数的形式发送到服务器。
/plus/list.php?tid=1&brand=海尔&price=0-1000 -
后端接收与处理:PHP代码接收到这些URL参数。
-
SQL查询构建:PHP根据接收到的参数,动态地构建一个复杂的SQL
WHERE子句。- 如果用户选择了“品牌=海尔”,
WHERE子句就加上AND brand = '海尔'。 - 如果用户选择了“价格=0-1000”,
WHERE子句就加上AND price BETWEEN 0 AND 1000。 - 如果用户没有选择某个条件,就不添加该条件的限制。
- 如果用户选择了“品牌=海尔”,
-
数据查询与分页:执行构建好的SQL查询,获取筛选后的结果集,并进行分页处理。
(图片来源网络,侵删) -
前端展示:将查询到的结果列表和分页信息展示给用户。
使用成熟的第三方筛选插件(最推荐)
这是最简单、最快捷的方式,适合大多数没有二次开发能力的用户,市面上有一些优秀的第三方开发者制作的筛选插件,它们通常功能完善,使用方便。
推荐插件:DedeCMS灵动筛选 或 DedeCMS筛选增强版
这类插件非常流行,通常具备以下特点:
- 功能强大:支持多栏目、多属性、多品牌、多价格区间、关键词搜索等多种筛选方式。
- 自定义字段支持:可以基于你自定义的文章模型字段(如
brand,price,color等)进行筛选。 - URL美化:可以将筛选后的URL伪静态化,更美观,也有利于SEO。
/list/brand-海尔-price-0-1000.html。 - 安装简单:通常提供完整的安装包,包含必要的文件修改和模板文件。
- 性能优化:一些好的插件会进行SQL优化,避免全表扫描,保证在高数据量下也能有较好的性能。
如何使用?
- 搜索与下载:在DedeCMS的官方论坛、模板市场或一些知名的CMS资源网站(如织梦58、源码爱好者等)搜索关键词“
DedeCMS筛选插件”、“DedeCMS多条件筛选”。 - 查看文档:下载插件后,务必仔细阅读其安装和使用文档。
- 安装部署:按照文档说明,上传文件、修改数据库、覆盖系统文件。
- 后台配置:登录DedeCMS后台,找到插件的管理界面,进行相关配置,如选择要筛选的栏目、关联的自定义字段等。
- 修改模板:插件通常会提供新的列表模板(
list_xxx.htm)和筛选器模板,你需要将你的列表页模板内容复制到新的模板中,并按照插件说明调用筛选标签和列表标签。
优点:

- 快速实现,无需编程知识。
- 功能稳定,有持续更新的可能性。
缺点:
- 可能与特定版本的DedeCMS兼容性不好。
- 插件质量参差不齐,需要仔细甄别。
- 可能存在后门或安全风险,务必从可信来源下载。
二次开发(最灵活、最强大)
如果你有PHP和DedeCMS模板的基础,或者你的筛选需求非常特殊,那么二次开发是最佳选择,这能让你完全掌控功能,并且代码最优化。
开发步骤详解:
第一步:准备数据
确保你的文章模型(在后台“核心” -> “内容模型管理”中)已经添加了需要筛选的自定义字段。
brand(品牌,文本类型)price(价格,数字类型)color(颜色,单选类型)
*第二步:修改列表页模板 (`list_.htm`)**
在你的列表页模板中,添加筛选条件的表单。
<!-- 筛选表单 -->
<form name="searchform" action="{dede:global.cfg_cmspath/}/plus/list.php" method="get">
<!-- 隐藏字段,传递栏目ID -->
<input type="hidden" name="tid" value="{dede:field.id/}" />
<!-- 品牌筛选 -->
<div>
<label>品牌:</label>
{dede:channelartlist typeid='当前栏目ID'}
{dede:sql sql='SELECT DISTINCT brand FROM `dede_archives` WHERE channel = 1 AND brand != "" ORDER BY brand'}
<label><input type="checkbox" name="brand" value="[field:brand/]" /> [field:brand/]</label>
{/dede:sql}
{/dede:channelartlist}
</div>
<!-- 价格区间筛选 -->
<div>
<label>价格:</label>
<label><input type="radio" name="price" value="" checked /> 不限</label>
<label><input type="radio" name="price" value="0-500" /> 500元以下</label>
<label><input type="radio" name="price" value="500-1000" /> 500-1000元</label>
<label><input type="radio" name="price" value="1000-" /> 1000元以上</label>
</div>
<button type="submit">筛选</button>
</form>
<hr>
<!-- 列表内容 -->
{dede:list pagesize='20'}
<a href="[field:arcurl/]">[field:title/]</a>
- 品牌:[field:brand/] - 价格:[field:price/]元
<br>
{/dede:list}
第三步:修改列表页PHP文件 (plus/list.php)
这是最核心的一步,我们需要在list.php中获取筛选参数,并修改SQL查询逻辑。
-
在文件开头,获取筛选参数:
// ... 其他代码 ... // 获取常规的分页和栏目参数 $tid = (isset($tid) && is_numeric($tid)) ? $tid : 0; // ... // --- 获取筛选参数 --- $brand = isset($brand) ? addslashes(trim($brand)) : ''; $price = isset($price) ? addslashes(trim($price)) : ''; // 可以继续添加更多参数 // ... // 构建WHERE子句 $addfields = ''; // 用于存储额外的WHERE条件 if (!empty($brand)) { $addfields .= " AND arc.brand = '$brand'"; } if (!empty($price)) { if ($price == '1000-') { $addfields .= " AND arc.price >= 1000"; } else { $price_range = explode('-', $price); $addfields .= " AND arc.price BETWEEN {$price_range[0]} AND {$price_range[1]}"; } } // ... // 将$addfields变量传递给后续的查询函数 // 在DedeCMS中,通常是通过修改 $ctag->GetAtt('num') 的值来实现,但这很复杂。 // 更简单直接的方法是找到执行查询的地方,手动拼接SQL。 // 在list.php中找到类似 $arr = GetSonIds($typeid, 0); 的代码后, // 找到执行查询的SQL语句,例如在 $dsql->Execute('me', $query); 之前。 // 你需要找到那个生成最终查询的代码块,并在其WHERE子句中加上 $addfields。 // 这通常需要你对DedeCMS的底层代码有一定了解。 // 一个常见的修改点是在查询文章列表的函数调用中传递额外参数。 -
修改查询逻辑: 直接修改
list.php比较复杂,因为它耦合了DedeCMS的很多内部逻辑,一个更清晰的方法是创建一个自定义的函数来处理筛选。// 在 list.php 中添加一个函数 function GetFilterList($typeid, $addfields = '') { global $dsql; $innertext = GetSysTemplets('list_fulllist.htm'); // 调用DedeCMS的核心查询函数,但传入我们的额外条件 // 这是一个简化的示例,实际中你需要找到正确的函数并修改它 // 或者直接在这里写一个新的查询逻辑 $sql = "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 arc.arcrank > -1 AND arc.channel = 1 {$addfields} AND (tp.id='$typeid' OR tp.reid='$typeid') ORDER BY arc.sortrank DESC"; $dsql->SetQuery($sql); $dsql->Execute('me'); // ... 后续处理逻辑 ... }注意:直接修改
list.php风险较高,容易破坏系统,更推荐的是方案三。
使用DedeCMS的“自定义表单”+“列表”组合(巧妙方案)
这是一个非常巧妙且相对安全的“曲线救国”方法,特别适合产品展示类的筛选。
思路:不直接在plus/list.php上动刀,而是创建一个专门用于筛选的自定义表单,然后用一个独立的PHP文件来处理筛选逻辑,最后将结果通过一个独立的模板展示出来。
步骤:
-
创建自定义表单:
- 后台 -> 核心 -> 自定义表单,创建一个名为
filter_search的表单。 - 添加字段:
brand(文本)、min_price(数字)、max_price(数字) 等。
- 后台 -> 核心 -> 自定义表单,创建一个名为
-
创建处理页面 (
filter.php):- 在网站根目录下新建一个
filter.php文件。 - 在这个文件里,你完全自主地编写筛选逻辑,不依赖DedeCMS的核心列表文件。
<?php require_once (dirname(__FILE__) . "/include/common.inc.php"); require_once DEDEINC.'/arc.listview.class.php'; // 1. 获取筛选参数 $brand = isset($_GET['brand']) ? trim($_GET['brand']) : ''; $min_price = isset($_GET['min_price']) ? intval($_GET['min_price']) : 0; $max_price = isset($_GET['max_price']) ? intval($_GET['max_price']) : 0; // 2. 构建WHERE条件 $where = "WHERE 1=1"; if ($brand) $where .= " AND arc.brand = '$brand'"; if ($min_price > 0) $where .= " AND arc.price >= $min_price"; if ($max_price > 0) $where .= " AND arc.price <= $max_price"; // 3. 创建ListView实例并设置参数 $lv = new ListView(); $typeid = '你的目标栏目ID'; // 指定要筛选的栏目 $lv->TypeID = $typeid; $lv->Fields = '*,type_2.typeid as typetypename'; // type_2是关联的栏目表别名 $lv->addSql = $where; // 关键!将自定义的WHERE条件注入 // 4. 显示结果 // 设置模板文件 $lv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/你的筛选模板.htm"); // 执行并显示 $lv->Display(); ?>
- 在网站根目录下新建一个
-
创建筛选模板 (
filter.htm):- 这个模板和普通的列表模板 (
list_xxx.htm) 基本一样,你可以直接复制一个过来使用。 - 在模板中,正常使用
{dede:list}标签即可,因为ListView类已经处理好了数据查询。
- 这个模板和普通的列表模板 (
-
在前端调用:
- 在需要展示筛选列表的页面,直接链接到
filter.php并带上参数即可。 <a href="/filter.php?brand=海尔">查看海尔品牌</a>
- 在需要展示筛选列表的页面,直接链接到
优点:
- 安全,不修改核心文件。
- 灵活,完全自主控制筛选逻辑。
- 可以实现非常复杂的筛选需求。
缺点:
- 需要一定的PHP编程能力。
- 需要手动处理分页等逻辑(不过
ListView类已经帮我们做好了)。
总结与建议
| 方案 | 优点 | 缺点 | 适用人群 |
|---|---|---|---|
| 第三方插件 | 快速、方便、功能齐全 | 兼容性、安全性风险 | 普通用户、急需上线的项目 |
| 二次开发 | 灵活、强大、性能最优 | 复杂、需要编程知识、有风险 | 开发者、有特殊需求的项目 |
| 自定义表单 | 安全、灵活、不伤核心 | 需要一定开发能力 | 开发者、追求稳定和自定义的用户 |
给你的建议:
- 如果你是新手或想快速搞定:首选方案一,花点时间找一个评价好的筛选插件,仔细阅读文档安装。
- 如果你有开发能力或需求特殊:强烈推荐方案三,它既安全又能满足高度自定义的需求,是比直接修改
list.php更优雅的解决方案。 - 直接修改
list.php(方案二):除非你非常了解DedeCMS的底层架构,否则不推荐,这就像是“外科手术”,风险很高。
希望这个详细的解析能帮助你找到最适合你的DedeCMS多条件筛选解决方案!
