- 什么是自定义字段关联?
- 它的核心作用和应用场景是什么?
- 如何一步步实现字段关联?(附详细步骤)
- 在模板中如何调用关联的数据?
- 注意事项和常见问题。
什么是自定义字段关联?
自定义字段关联就是在一个文档(文章、产品等)中,通过一个特殊类型的字段(通常是“联动类型”或“多选类型”),来“链接”到另一个栏目或模型下的一个或多个文档。

这个过程不是数据库层面的外键关联,而是通过织梦内置的字段类型和标签系统实现的逻辑关联,它就像是给每个文档添加了一个“标签”或“索引”,指向了其他相关的内容。
核心作用和应用场景
这个功能极大地扩展了织梦的灵活性,非常适合以下场景:
- 电商网站:
- 商品 -> 配件/套餐: 在一个“手机”商品的自定义字段中,关联其“原装充电器”、“保护壳”等配件商品。
- 商品 -> 相关推荐: 在商品详情页,通过关联字段展示“同类商品”或“购买此商品的人还购买了”。
- 新闻/文章网站:
- 新闻 -> 相关新闻: 在一篇新闻稿的详情页,通过关联字段展示“相关报道”、“背景资料”或“后续新闻”。
- 文章 -> 作者文集: 如果你有“作者”模型,可以在文章中关联该作者的档案页面。
- 房产/招聘网站:
- 房源 -> 小区详情: 在一个房源信息页,通过字段关联到该房源所属的“小区”详情页。
- 职位 -> 公司介绍: 在一个招聘职位页,关联到发布该职位的“公司”介绍页面。
- 图库/作品集:
- 作品 -> 项目合集: 在一个单张作品页,关联到它所属的“项目合集”页面。
如何一步步实现字段关联?(以“商品关联配件”为例)
假设我们有一个“商品”栏目,希望每个商品都能关联到若干个“配件”商品。
确定关联的栏目和模型
- 主栏目(被关联方): “商品”栏目,这个栏目下的每个商品,都将作为被关联的目标。
- 关联栏目(关联方): “配件”栏目,这个栏目下的商品,将被“商品”栏目关联。
- 重要提示: 确保这两个栏目使用的是相同或兼容的模型,或者至少“配件”栏目的模型字段是“商品”模型的一个子集,最简单的方式是,它们都使用同一个“商品模型”。
为“商品”模型添加“关联配件”字段
- 登录织梦后台,进入 【核心】 -> 【频道模型】 -> 【内容模型管理】。
- 找到并点击你的“商品”模型(普通文章”模型,或者你自定义的“商品模型”)。
- 点击 【管理字段】。
- 点击 【添加新字段】。
- 填写字段信息:
- 字段名称:
guanlian_peijian(英文,不含空格) - 字段说明:
关联配件(中文,在后台显示) - 字段类型: 这里最关键! 根据你的需求选择:
- 联动类型: 如果你想关联一个单一的配件(比如每个手机只关联一个主推配件),选择这个,它需要一个预先设置好的联动类型。
- 多选类型: 强烈推荐用于关联多个目标。 我们选择这个。
- 频道类型: 这个也可以,但设置稍复杂,多选类型更直观。
- 这里我们选择“多选类型”。
- 字段名称:
- 设置“多选类型”参数:
- 数据来源: 选择 “手动录入”。
- 数据列表: 你需要手动输入所有可选的配件名称,格式为
名称|链接。原装充电器|/plus/view.php?aid=123 保护壳|/plus/view.php?aid=124 蓝牙耳机|/plus/view.php?aid=125- 注意: 后面是配件文档的静态地址,你可以在“配件”栏目下发布一篇文档后,复制其浏览地址过来,如果你有很多配件,手动输入会很麻烦,这是此方法的一个缺点,另一种方法是使用SQL查询,但需要一定技术。
- 勾选 【使字段可以在列表页作为排序条件使用】 和 【使字段可以在列表页被搜索】(可选)。
- 点击 【保存】。
“商品”模型里就有了一个“关联配件”字段,去发布一篇商品文章,你就能在自定义字段区域看到这个字段,并可以从中选择一个或多个配件。

如何自动填充关联列表?(更高级的方法)
手动输入所有配件链接不现实,织梦提供了更好的方法:通过SQL查询动态生成选项列表。
-
回到 模型管理】 -> 【管理字段】,编辑你刚刚创建的
guanlian_peijian字段。 -
在 “数据列表” 输入框中,清空之前手动输入的内容。
-
输入以下SQL查询语句(请根据你的实际情况修改表前缀
#@__和栏目ID5):SELECT title,arc.id FROM `#@__archives` arc LEFT JOIN `#@__arctype` t ON arc.typeid = t.id WHERE t.id = 5 -- 这里替换成你的“配件”栏目的ID ORDER BY arc.id DESC
- 语句解释:
SELECT title,arc.id:选择文档的标题和文档ID。FROM#@__archives``:从主表查询。LEFT JOIN ...:关联栏目表,以便筛选指定栏目。WHERE t.id = 5:这是关键! 只选择“配件”栏目(ID为5)下的文档。ORDER BY arc.id DESC:按ID降序排列,最新的在前面。
- 语句解释:
-
点击 【保存】。
你再发布商品文章时,“关联配件”字段的下拉列表就会自动从“配件”栏目中加载所有最新的文档了,你只需勾选即可,非常方便!
在模板中如何调用关联的数据?
假设你在商品详情页模板(article_article.htm)中,想调用当前文章的“关联配件”。
织梦提供了专门的标签 {dede:field} 来输出自定义字段。
直接输出原始值(不推荐)
<p>关联的配件ID列表:{dede:field name='guanlian_peijian'/}</p>
这会直接输出你选择的配件ID,格式如 123,124,无法直接使用。
使用 function 进行处理(推荐)
这是最常用也是最灵活的方法,我们可以写一个PHP函数来解析这个ID列表,并循环输出对应的配件信息。
-
修改模板文件
article_article.htm:<h3>相关配件</h3> <ul> {dede:field name='guanlian_peijian' function="GetRelatedPeijian(@me)"/} </ul> -
在织梦include/extend.func.php文件中添加PHP函数:
打开
/include/extend.func.php文件,在文件末尾添加以下代码:/** * 解析关联配件字段并输出HTML列表 * @param string $ids 关联的文档ID列表,如 '123,124' * @return string 生成的HTML列表 */ function GetRelatedPeijian($ids) { if (empty($ids)) { return '<li>暂无相关配件</li>'; } $dsql = new DedeSql(false); $ids_arr = explode(',', $ids); $html = ''; foreach ($ids_arr as $id) { $id = intval($id); // 安全处理 if ($id > 0) { // 查询关联文档的信息 $dsql->SetQuery("SELECT * FROM `#@__archives` WHERE id = $id"); $dsql->Execute('one'); $row = $dsql->GetArray('one'); if (is_array($row)) { $arcurl = GetOneArchive($id); // 获取文档链接 $html .= "<li><a href='{$arcurl['arcurl']}'>{$row['title']}</a></li>"; } } } $dsql->Close(); return empty($html) ? '<li>暂无相关配件</li>' : $html; } -
刷新页面,商品详情页的“相关配件”部分就会正确显示一个包含配件链接的列表了。
注意事项和常见问题
- 性能问题: 如果关联的文档数量非常多,每次页面加载时都通过SQL查询去获取关联信息,可能会对服务器造成一定压力,对于少量关联(如10个以内),完全没问题。
- 数据同步: 如果被关联的文档(如配件)被删除了,那么它在关联列表中的链接就会失效(变成404),你需要手动去删除其他文档中对该配件的关联,或者写一个程序来维护这种关联的完整性。
- 模型一致性: 确保关联双方的字段结构兼容,或者至少被关联方有必要的字段(如
title)。 - 权限控制: 确保后台有权限管理模型和字段的用户才能进行这些设置。
- 静态化: 使用了关联标签的页面,在更新内容后,需要重新生成对应的HTML页面,才能看到最新的关联效果。
通过以上步骤,你就可以在织梦中熟练运用“自定义字段关联”功能,构建出内容丰富、结构复杂的网站了。
