核心思路
无论使用哪种方法,核心思路都是一致的:

(图片来源网络,侵删)
- 确定数据来源:播放地址存在哪个表、哪个字段里?(
dede_addonmovie表的playurl字段)。 - 获取当前文章ID:织梦模板中,用
{dede:field.id/}可以获取到当前文章的ID。 - 关联查询:使用织梦的标签,通过文章ID去附加表中查询对应的播放地址数据。
- 解析并输出:播放地址通常是多集的,用 或其他符号分隔,需要将其拆分成一个列表,并进行循环输出。
使用 {dede:field} 标签直接调用(最简单)
如果你的播放地址直接存储在主表(dede_archives)的自定义字段中,或者你只想简单地调用一个字符串,这是最快的方法。
适用场景:
- 播放地址只有一集(单集视频)。
- 播放地址是固定的,不需要解析多集。
步骤:
- 在后台添加自定义字段,字段名为
playurl,类型选择“文本area”。 - 在发布或编辑电影时,在
playurl字段中填入播放地址,http://xxx.com/1.mp4|http://xxx.com/2.mp4|http://xxx.com/3.mp4 - 在模板文件(通常是
article_article.htm)中,直接调用:
<div class="play-box">
<h3>播放地址</h3>
<!-- 直接输出整个字符串 -->
<p>{dede:field.playurl/}</p>
</div>
缺点:这种方法输出的是一个长字符串,用户体验很差,无法选择集数。

(图片来源网络,侵删)
使用 {dede:arclist} 或 {dede:list} 结合附加表(推荐)
这是最标准、最推荐的方法,尤其适用于将播放地址存储在附加表中的情况。
适用场景:
- 播放地址存储在附加表(如
dede_addonmovie)。 - 需要将播放地址解析成列表,方便用户点击播放。
步骤:
确认附加表和字段
假设你的电影模型使用了 dede_addonmovie 作为附加表,并且你添加了一个名为 playurl 的文本字段来存储播放地址。

(图片来源网络,侵删)
编写模板代码页模板(article_article.htm)中,使用 {dede:field} 的 function 属性来调用一个自定义的PHP函数,这是最灵活强大的方式。
方案A:使用 array_slice 和 implode (推荐)
这种方法通过PHP代码将播放地址字符串拆分成数组,然后循环输出。
<!-- 在 article_article.htm 中 -->
<div class="play-box">
<h3>选择播放集数</h3>
<ul class="play-list">
{dede:field name='id' function="GetPlayUrl(@me)" /}
</ul>
</div>
关键步骤:创建自定义函数 GetPlayUrl
- 打开织梦根目录下的
/include/common.func.php文件。 - 在文件末尾
?>之前,添加以下PHP函数代码:
/**
* 解析播放地址并生成HTML列表
* @param int $aid 文章ID
* @return string 播放列表的HTML代码
*/
function GetPlayUrl($aid) {
// 1. 获取附加表名和播放地址
// 假设你的模型ID是1,附加表是 dede_addonmovie
// 你需要根据你的实际情况修改 $addon 和 $field
$addon = 'dede_addonmovie';
$field = 'playurl';
// 查询附加表数据
$row = $GLOBALS['dsql']->GetOne("SELECT `$field` FROM `$addon` WHERE aid='$aid'");
if (is_array($row)) {
$playUrls = explode('|', $row[$field]);
// 如果没有地址,返回空
if (empty($playUrls)) {
return '';
}
// 生成列表HTML
$html = '';
$i = 1;
foreach ($playUrls as $url) {
$url = trim($url);
if (!empty($url)) {
$html .= "<li><a href='{$url}' target='_blank'>第{$i}集</a></li>";
$i++;
}
}
return $html;
}
return ''; // 如果没找到数据,返回空
}
代码解释:
- 这个函数接收文章ID (
$aid)。 - 它通过
DedeSQL($GLOBALS['dsql']) 查询附加表dede_addonmovie中对应文章ID的playurl字段。 - 使用
explode('|', ...)将用 分隔的字符串拆分成一个数组。 - 使用
foreach循环数组,为每一个地址生成一个<li>- 最后返回拼接好的HTML字符串。
方案B:使用织梦自带的 list 标签(稍显复杂)
如果你不想修改PHP文件,也可以在模板里嵌套使用 {dede:sql} 和 {dede:list},但这种方法效率较低,代码也较臃肿,不推荐。
使用自定义模型 + 单独字段(最规范)
对于多集视频网站,最规范的做法不是用一个文本字段存所有地址,而是为每一集创建一个独立的字段。
适用场景:
- 视频集数固定(例如最多30集)。
- 后台需要为每一集单独填写地址,更灵活。
步骤:
- 在后台创建或修改自定义模型。
- 添加多个单行文本字段,
playurl1,playurl2,playurl3, ...playurl30。 - 在模板中直接调用:
<div class="play-box">
<h3>播放地址</h3>
<ul>
{dede:field.playurl1 runphp='yes'}
if(@me != '') @me = "<li><a href='{@me}' target='_blank'>第1集</a></li>";
else @me = '';
{/dede:field}
{dede:field.playurl2 runphp='yes'}
if(@me != '') @me = "<li><a href='{@me}' target='_blank'>第2集</a></li>";
else @me = '';
{/dede:field}
<!-- ... 可以继续添加更多集数 ... -->
</ul>
</div>
缺点:如果集数很多,模板会变得非常冗长,维护困难。此方法仅适用于集数非常少的情况。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 直接调用 | 极其简单,无需修改代码 | 无法解析多集,用户体验差 | ⭐ (仅用于单集或测试) |
| 附加表+PHP函数 | 灵活、强大、性能好、代码整洁 | 需要修改PHP文件,对新手稍有门槛 | ⭐⭐⭐⭐⭐ (强烈推荐) |
| 独立字段 | 数据结构清晰,后台管理直观 | 模板代码冗长,扩展性差 | ⭐⭐ (仅适用于集数固定的少数场景) |
最终建议:
对于绝大多数织梦电影网站,请使用 方法二,它兼顾了灵活性、性能和代码的可维护性,只需要在 /include/common.func.php 中添加一次 GetPlayUrl 函数,之后所有内容页都可以通过 {dede:field name='id' function='GetPlayUrl(@me)'/} 来优雅地调用播放列表。
额外提示:
- 安全性:在输出播放地址时,确保地址是可信的,如果地址来自用户输入,最好进行一些过滤,防止XSS攻击。
- 播放器:调用到地址后,你需要使用一个视频播放器(如 DPlayer、JW Player、CKPlayer等)来播放这些地址,通常做法是,点击列表中的“第X集”时,通过JavaScript改变播放器的
src属性,这需要前端和后端的配合。
