使用 litpic 字段(最常用、最推荐)
litpic 是文章缩略图字段,在默认情况下,如果文章没有设置缩略图,litpic 的值会是空,有一个非常巧妙的利用方式:

原理:
当你添加图集时,系统会自动将图集的第一张图片设置为该文章的缩略图(litpic),即使你手动添加了缩略图,这个技巧在很多情况下依然有效。
代码示例:
直接在 arclist 标签中使用 [field:litpic/] 即可。
{dede:arclist row='10' titlelen='30'}
<li>
<a href="[field:arcurl/]">
<!-- 直接调用 litpic 字段,它就是原图 -->
<img src="[field:litpic/]" alt="[field:title/]" />
</a>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
优点:
- 简单高效:无需额外配置,直接调用系统自带字段。
- 性能好:
litpic是文章表的一个字段,查询速度快。
适用场景:

- 图集列表页。
- 后台设置了“文章没有缩略图时,则调用文章内容第一张图片”的网站。
使用 body 字段配合正则表达式(最灵活、最强大)
litpic 方法不满足你的需求(你明确想从文章内容 [field:body/] 中提取第一张图片),那么可以使用自定义函数结合正则表达式。
原理:
通过 PHP 的正则表达式,从文章内容中匹配出第一个 <img> 标签的 src 属性值。
步骤 1:创建自定义函数文件
在 include/extend.func.php 文件中(如果不存在,请自行创建),添加以下 PHP 函数代码:
/**
* 从文章内容中提取第一张图片的地址
* @param string $body 文章内容
* @return string 第一张图片的地址,如果没有则返回默认图片
*/
function GetFirstImg($body)
{
// 正则表达式匹配 img 标签的 src 属性
$pattern = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
preg_match_all($pattern, $body, $matches);
// 如果找到了图片
if (isset($matches[1][0])) {
// 返回第一张图片的 src
return $matches[1][0];
} else {
// 如果没有找到图片,可以返回一个默认图片地址,避免显示破损图标
// return '/images/default.jpg';
return '';
}
}
步骤 2:在 arclist 标签中调用函数
你可以在模板文件中使用 {dede:field function='函数名(@me)'/} 的方式来调用这个函数。

{dede:arclist row='10' titlelen='30'}
<li>
<a href="[field:arcurl/]">
<!-- 调用我们刚刚创建的函数,参数是文章内容 [field:body/] -->
[field:body function='GetFirstImg(@me)'/]
</a>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
注意:
上面的代码会直接输出 <img src="..."> 标签,如果你想更灵活地控制,比如添加样式或默认图片,可以修改函数的返回值,或者在外层用 <img> 标签包裹。
更完善的调用方式(推荐):
在函数中处理默认图片,并在模板中直接输出 src。
修改 extend.func.php 中的函数:
// ... 函数同上,但在最后 return 时处理默认图片
if (isset($matches[1][0])) {
return $matches[1][0];
} else {
// 返回一个默认图片地址
return '/images/no_pic.jpg'; // 请确保这个图片存在
}
修改模板文件:
{dede:arclist row='10' titlelen='30'}
<li>
<a href="[field:arcurl/]">
<!-- 直接调用函数获取图片地址,然后用 <img> 标签显示 -->
<img src="[field:body function='GetFirstImg(@me)'/]" alt="[field:title/]" />
</a>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
优点:
- 极其灵活:可以精确控制从哪里取图,不受缩略图设置的影响。
- 功能强大:可以轻松扩展,比如获取图片尺寸、添加水印等。
缺点:
- 性能稍差:每次调用都需要对文章内容进行正则匹配,对于列表数据量大的网站,可能会有轻微的性能影响。
- 需要修改文件:需要修改
extend.func.php文件,对新手有一定门槛。
使用附加表 addonimages(专门针对图集)
如果你的文章是“图集”类型,并且数据存储在 dede_addonimages 附加表中,那么可以直接调用这个表里的图片。
原理:
图集的第一张图片通常存储在附加表的 imgurls 字段中,并且其 rank 字段为0。
代码示例:
这需要你有一定的 SQL 基础,通常结合 arclist 的 channelid 和底层模板来实现。
{dede:arclist row='10' channelid='1' addfields='imgurls'}
<li>
<a href="[field:arcurl/]">
<!-- 解析 imgurls 字段,获取第一张图片 -->
[field:imgurls runphp='yes']
$dsql = new DedeSql(false);
// 这里的逻辑需要根据你的 imgurls 字段实际格式来写
// imgurls 是一个序列化的字符串,包含图片路径和说明
// 以下是一个常见的解析逻辑,但可能需要调整
$imgurls = @me;
$preg = "/.*?<img.*?src=['|"](.+?)['|"].*?>/i";
preg_match_all($preg, $imgurls, $matchs);
if(isset($matchs[1][0])){
@me = $matchs[1][0];
}else{
@me = '/images/default.jpg';
}
[/field:imgurls]
</a>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
优点:
- 数据源准确:直接从图集数据表中读取,保证是原图集中的图片。
缺点:
- 实现复杂:需要了解附加表结构和
imgurls的存储格式,SQL 查询和字符串处理比较麻烦。 - 通用性差:只适用于图集模型,不适用于普通文章。
总结与建议
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
litpic |
简单、高效、性能好 | 依赖后台缩略图设置,有时可能不准确 | 绝大多数情况下的首选,特别是图集列表。 |
body+正则 |
灵活、强大、不受缩略图影响 | 性能稍差,需要修改PHP文件 | 当你需要强制从文章内容中提取图片时,或者 litpic 无法满足需求时。 |
addonimages |
数据源准确,专为图集设计 | 实现复杂,通用性差 | 仅当你需要精确调用图集附加表中的图片,且不满足其他方法时。 |
给你的最终建议:
- 首先尝试方法一 (
litpic),这是最简单、最符合 DedeCMS 设计逻辑的方式,能解决80%以上的问题。 - 如果方法一的结果不符合你的预期(比如你发现
litpic不是你想要的原图),再使用方法二 (body+正则),这是最可靠、最灵活的通用方案。 - 方法三 除非你有特殊需求,否则一般不推荐使用,因为它太复杂了。
希望这个详细的解释能帮助你解决问题!
