联动筛选是织梦一个非常强大且实用的功能,它允许你在网站前台根据分类、地区、品牌、属性等多个维度进行动态筛选和组合查询,极大地提升了用户体验和网站的交互性,一个房产网站可以按“城市 -> 区域 -> 小区”进行筛选,一个商城可以按“品牌 -> 价格区间 -> 尺寸”进行筛选。

这个功能的核心在于“联动类别”的管理和使用。
联动筛选的原理
联动筛选的原理主要分为三步:
- 创建数据结构:在后台创建“联动类别”,定义好筛选的层级和选项,创建一个“产品规格”的联动类别,第一级是“颜色”,第二级是“尺寸”。
- 在前台表单中调用:在前台模板文件中,使用织梦的标签
{dede:linkage}将这些联动类别以表单(通常是下拉菜单)的形式展示出来。 - 接收筛选条件并查询:用户选择筛选条件并提交后,PHP 脚本接收这些值,并将其构造成 SQL 查询语句的
WHERE条件,从而筛选出符合要求的内容。
后台设置:创建联动类别
这是整个功能的基础,我们以一个“产品筛选”为例,假设筛选条件为“品牌”和“系列”。
步骤 1:进入联动类别管理
登录织梦后台,找到菜单栏的 【核心】 -> 【联动类别】,点击进入。

步骤 2:添加新的联动类别
- 点击 【增加顶级分类】。
- 在弹出的表单中填写信息:
- 分类名称:填写一个易于识别的名称,
产品筛选。 - 分类表名:系统会自动生成一个表名,如
dede_addonlinkage。这个名称很重要,在模板调用时会用到,通常不需要修改。 - 是否开启:选择“是”。
- 是否显示:选择“是”。
- 是否支持手动分类:根据需要选择,如果允许用户在前台添加新的筛选选项(如新品牌),则选“是”。
- 其他选项:保持默认即可。
- 分类名称:填写一个易于识别的名称,
- 点击 【确定】,顶级分类创建成功。
步骤 3:添加子分类(筛选层级)
我们为“产品筛选”这个顶级分类添加具体的筛选项。
- 在左侧列表中,点击你刚刚创建的顶级分类
产品筛选。 - 点击 【增加子分类】。
- 添加第一级筛选:品牌
- 分类名称:
品牌 - 分类关键字:
brand(可选,方便识别) - 上级分类:自动关联为
产品筛选 - 是否开启:
是 - 点击 【确定】。
- 分类名称:
- 为“品牌”添加选项
- 在左侧选中
品牌这个分类。 - 点击 【增加选项】。
- 在输入框中输入一个品牌名,
苹果,点击 【增加】。 - 继续添加
三星、华为、小米等其他品牌。
- 在左侧选中
- 添加第二级筛选:系列
- 回到左侧,选中顶级分类
产品筛选。 - 再次点击 【增加子分类】。
- 分类名称:
系列 - 分类关键字:
series - 上级分类:
产品筛选 - 是否开启:
是 - 点击 【确定】。
- 回到左侧,选中顶级分类
- 为“系列”添加选项
- 在左侧选中
系列这个分类。 - 点击 【增加选项】,添加
iPhone、Galaxy、Mate、Redmi等系列。
- 在左侧选中
最终效果:你的联动类别结构应该像这样:
- 产品筛选 (顶级)
- 品牌 (子分类)
- 苹果 (选项)
- 三星 (选项)
- 系列 (子分类)
- iPhone (选项)
- Galaxy (选项)
- 品牌 (子分类)
至此,后台的数据结构已经创建完成。
前台调用:在模板中使用
后台设置好后,我们需要在前台模板文件中调用这些联动菜单。

假设你的列表页模板是 list_article.htm页模板是 article_article.htm。
步骤 1:在列表页添加筛选表单
在 list_article.htm 中,你希望显示筛选表单的位置,添加以下代码:
<form name="searchform" action="{dede:global.cfg_cmspath/}/plus/list.php" method="get">
<!-- 调用品牌筛选 -->
<div>
<label>品牌:</label>
{dede:linkage
type='产品筛选/brand'
noself='no'
eajax='1'
}
</select>
</div>
<!-- 调用系列筛选 -->
<div>
<label>系列:</label>
{dede:linkage
type='产品筛选/series'
noself='no'
eajax='1'
}
</select>
</div>
<input type="hidden" name="tid" value="{dede:field.id/}" />
<button type="submit">筛选</button>
</form>
代码解释:
{dede:linkage}:这是调用联动菜单的核心标签。type='产品筛选/brand':最关键的参数,格式为顶级分类名/子分类名,告诉织梦要调用哪个联动分类。noself='no':是否包含“请选择”等提示项。no表示不包含,yes表示包含。eajax='1':开启 Ajax 动态加载,选择“品牌”后,“系列”的下拉选项可以动态变化(需要编写额外的 JS 逻辑,这里先不展开)。name='brand':给下拉菜单指定的name属性。这个 name 值必须和后台子分类的关键字一致,这样 PHP 才能正确接收筛选值。<form action=".../plus/list.php">:织梦列表页的标准提交地址。<input type="hidden" name="tid" ...>:保持当前栏目的 ID,确保筛选是在当前栏目下进行。
步骤 2:修改列表页 PHP 文件以处理筛选
模板只是生成了表单,真正的数据筛选逻辑在 PHP 文件中,织梦默认的列表页处理文件是 /plus/list.php。强烈建议不要直接修改它,因为升级会被覆盖,正确的做法是复制一份并重命名。
- 复制
/plus/list.php文件,在同一目录下重命名为my_list.php。 - 修改
list_article.htm中的表单action地址:<form name="searchform" action="{dede:global.cfg_cmspath/}/plus/my_list.php" method="get"> - 打开
my_list.php文件,找到if($typeid != 0)这段代码(通常在文件中下部),在if语句内部、$channelid = GetChannelid($typeid);这行代码之后,添加以下代码:
// -----------------------------------
// 开始处理联动筛选
// -----------------------------------
$linkage_sql = "";
if (!empty($_GET['brand'])) {
$brand = $_GET['brand'];
$linkage_sql .= " AND ( CONCAT(a.keywords, '|', a.templet) LIKE '%{$brand}|%' OR a.keywords LIKE '%{$brand}%' )";
}
if (!empty($_GET['series'])) {
$series = $_GET['series'];
$linkage_sql .= " AND ( CONCAT(a.keywords, '|', a.templet) LIKE '%{$series}|%' OR a.keywords LIKE '%{$series}%' )";
}
// 将筛选条件拼接到主查询的 WHERE 子句中
// 找到类似 $ctag->GetAtt('sql'); 的地方,将其结果与 $linkage_sql 拼接
// 这是一个简化的示例,实际代码位置可能需要微调
// 更稳妥的方法是修改 $addsql 变量
if ($linkage_sql) {
// $addsql 已经存在,用 AND 连接
if ($addsql) {
$addsql .= $linkage_sql;
} else {
$addsql = " WHERE 1=1 " . $linkage_sql;
}
}
// -----------------------------------
// 联动筛选处理结束
// -----------------------------------
代码解释:
- 我们通过
$_GET['brand']和$_GET['series']获取前台表单提交的值。 - 重要:织梦默认将联动选项的值存储在文章的
keywords字段中,多个值用 分隔,所以我们的查询逻辑是LIKE '%品牌名|%'。 $linkage_sql构造了附加的 SQLWHERE条件。- 我们将
$linkage_sql拼接到织梦主查询的$addsql变量中,从而影响最终的查询结果。
进阶与注意事项
数据存储方式(推荐)
直接存在 keywords 里虽然简单,但不够规范,查询效率也低,更推荐的方式是使用自定义模型和附加表。
- 创建自定义模型:在后台【核心】->【内容模型管理】中创建一个“产品”模型。
- 添加字段:在模型中添加“品牌”和“系列”两个字段,字段类型选择“联动类型”,并关联到你之前创建的联动类别。
- 时,就可以直接选择品牌和系列了。
- 修改查询逻辑:
my_list.php中的查询逻辑就要变了,不再是查keywords,而是查附加表里的对应字段。
// 假设附加表是 dede_addonproduct,字段是 brand 和 series
if (!empty($_GET['brand'])) {
$brand = $_GET['brand'];
$linkage_sql .= " AND a.brand = '{$brand}'"; // 直接等于,效率更高
}
if (!empty($_GET['series'])) {
$series = $_GET['series'];
$linkage_sql .= " AND a.series = '{$series}'";
}
这种方式更标准、更高效,是大型站点的首选。
Ajax 联动
要实现“选择品牌后,动态加载该品牌下的系列”,你需要使用 jQuery 和织梦的 eajax 机制。
- 修改联动标签:给品牌的下拉菜单添加一个
id,并设置eajax。 - 编写 JS:监听品牌下拉菜单的
change事件,获取选中的值,然后通过 Ajax 请求一个专门处理联动加载的 PHP 文件(如/plus/linkage.php),并将返回的 HTML 填充到系列的下拉菜单中。
这部分相对复杂,需要一定的 JS 基础,但网上有很多现成的教程和代码可以参考。
URL 美化
默认的筛选 URL 可能是 .../my_list.php?tid=1&brand=苹果&series=iPhone,你可以通过织梦的 【栏目】->【栏目管理】->【修改】->【列表选项】 中的“列表命名规则”来美化 URL,例如设置为 {tid}_{brand}_{series}/,使其变为 .../1_苹果_iPhone/ 的形式。
| 步骤 | 操作 | 关键点 |
|---|---|---|
| 后台 | 创建联动类别 | 定义好顶级分类和子分类(筛选维度),并添加好选项(筛选值)。 |
| 模板 | 调用联动菜单 | 使用 {dede:linkage} 标签,type 参数指定分类,name 参数指定接收值的变量名。 |
| PHP | 处理筛选逻辑 | 复制 list.php 为 my_list.php,在其中获取 $_GET 值,并构造 SQL WHERE 条件,拼接到主查询中。 |
| 进阶 | 优化数据存储 | 推荐使用自定义模型和附加表来存储筛选值,查询更高效、更规范。 |
联动筛选功能是织梦的精髓之一,虽然初次设置略显繁琐,但一旦配置好,就能非常灵活地实现各种复杂的筛选需求,希望这份详细的教程能帮助到你!
