使用 array 自定义函数(最推荐,最灵活)
这是目前最主流、最灵活的方法,它可以在不修改系统核心文件的情况下,通过自定义一个函数来获取文章正文的第一张图片。

(图片来源网络,侵删)
步骤 1:创建自定义函数文件
- 在你的网站根目录下找到
include/文件夹。 - 在
include/文件夹中创建一个新文件,命名为extention.func.php。(如果这个文件已存在,则直接在其中添加代码即可)。 - 在
extention.func.php文件中,添加以下 PHP 函数代码:
/**
* 获取文章内容中的第一张图片路径
* @param string $body 文章内容
* @param string $imgurl 默认图片路径(如果文章没有图片则返回此默认图)
* @return string 图片路径
*/
function GetFirstImg($body, $imgurl = '/images/defaultpic.jpg') {
// 匹配 img 标签的 src 属性
$pattern = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
preg_match_all($pattern, $body, $matches);
// 如果找到了图片,则返回第一张的 src
if (!empty($matches[1])) {
// 处理相对路径,转为绝对路径
$first_img = $matches[1][0];
if (strpos($first_img, 'http') !== 0) {
$first_img = 'http://' . $_SERVER['HTTP_HOST'] . $first_img;
}
return $first_img;
}
// 如果没有找到图片,则返回默认图片
return $imgurl;
}
代码解释:
- 这个函数
GetFirstImg接收两个参数:$body)和$imgurl(一个可选的默认图片路径)。 - 它使用正则表达式
preg_match_all在文章内容中查找所有<img>标签的src属性。 - 如果找到了图片,它会返回第一张图片的
src,并将其转换为绝对路径。 - 如果没有找到任何图片,它会返回你设置的默认图片路径(
/images/defaultpic.jpg)。请确保这个默认图片存在。
步骤 2:在模板文件中使用
打开你的列表模板文件,通常是 templets/你的模板目录/list_article.htm。
在 list 标签循环内部,使用 {dede:field function='GetFirstImg(@me)'/} 来调用。
完整示例代码:

(图片来源网络,侵删)
{dede:list pagesize='10'}
<li>
<!-- 调用文章第一张图片,如果没有则使用默认图 /images/defaultpic.jpg -->
<a href="[field:arcurl/]">
<img src="{dede:field function='GetFirstImg(@me, "/images/defaultpic.jpg")'/}" alt="[field:title function='html2text(@me)'/]" />
</a>
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p>[field:description function='cn_substr(@me, 100)'/]...</p>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:list}
说明:
[field:body/]:这是文章正文的完整字段,我们把它作为参数@me传递给GetFirstImg函数。function='GetFirstImg(@me, "/images/defaultpic.jpg")':这里调用了我们刚刚创建的函数。@me代表当前字段的值(即文章内容),"/images/defaultpic.jpg"是我们传入的默认图片路径。alt="[field:title function='html2text(@me)'/]":为图片添加alt属性,这是良好的 SEO 实践。html2text函数可以去除标题中的 HTML 标签。
修改 arc.listview.class.php 文件(传统方法,不推荐)
这种方法是直接修改 DedeCMS 的核心类文件,虽然也能实现,但有以下缺点:
- 升级 DedeCMS 时,修改的代码会丢失,需要重新修改。
- 直接修改核心文件,存在一定的风险。
仅作了解,不建议新手使用。
- 找到文件
/include/arc.listview.class.php。 - 在第 727 行左右找到
//设置环境变量这段代码。 - 在
SetEnv函数中,找到if($this->Fields['description'] != '')这部分,在它后面添加获取图片的逻辑。 - 在
else分支里,也添加类似的逻辑。
修改后的代码片段(仅供参考):

(图片来源网络,侵删)
// 在 SetEnv 函数中,修改 else 分支(如果没有描述)
else {
// ... 其他代码 ...
// 添加以下代码来获取第一张图片
$this->Fields['litpic'] = '';
$body = $this->Fields['body'];
$preg = "/<img.*?src=['|"](.*?)['|"].*?[/]?>/is";
preg_match_all($preg, $body, $match);
if (!empty($match[1])) {
$this->Fields['litpic'] = $match[1][0];
}
// ... 其他代码 ...
}
在模板中的使用: 修改后,你就可以像调用普通缩略图一样调用它了。
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
</a>
<!-- ... 其他内容 ... -->
</li>
{/dede:list}
直接调用文章缩略图 [field:litpic/]
如果你的文章在发布时,已经通过“远程图片本地化”或者手动上传的方式,将第一张图片设置为了文章的缩略图(即 litpic 字段),那么事情就变得非常简单。
你只需要直接调用 [field:litpic/] 即可。
适用场景:
- 你在后台发布文章时,手动点击了“提取远程图片并保存到本地”。
- 你手动上传了图片并设置为缩略图。
模板代码:
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" onerror="this.src='/images/defaultpic.jpg';" />
</a>
<!-- ... 其他内容 ... -->
</li>
{/dede:list}
代码优化:
onerror="this.src='/images/defaultpic.jpg';" 是一个非常实用的技巧。[field:litpic/] 获取的图片路径不存在或加载失败,会自动触发 onerror 事件,显示你指定的默认图片,避免页面出现破损的图片图标。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
array 自定义函数 |
灵活、安全、不破坏核心文件、可自定义默认图 | 需要手动创建函数文件 | ★★★★★ (强烈推荐) |
| 修改核心文件 | 无需修改模板 | 破坏核心、升级麻烦、有风险 | ★☆☆☆☆ (不推荐) |
直接调用 litpic |
最简单、效率最高 | 依赖后台设置缩略图,无法自动获取正文图片 | ★★★★☆ (适合已设置好缩略图的情况) |
对于绝大多数情况,强烈推荐使用方法一,它一劳永逸,解决了自动获取正文图片的问题,并且非常安全。
