使用自定义函数(最推荐、最灵活)
这是最专业、最推荐的方法,通过创建一个自定义函数,我们可以在列表标签中像调用普通字段一样(如 [field:title/])来调用文章的第一张图片。

(图片来源网络,侵删)
优点:
- 代码简洁:在模板里只需要一个简单的标签。
- 性能高:函数在PHP层面处理,效率比模板标签高。
- 灵活性高:可以轻松修改函数以实现更多功能,比如获取指定大小的图片、判断有无图片等。
操作步骤:
第一步:创建自定义函数文件
- 打开你的织梦网站根目录。
- 找到并打开
/include/extend.func.php文件,如果这个文件不存在,请自己创建一个。 - 在这个文件的末尾(
?>之前),添加以下PHP代码:
/**
* 获取文章第一张图片路径
* @param string $body 文章内容
* @return string 图片路径,如果没有则返回默认图片
*/
function GetFirstImg($body) {
// 如果内容为空,返回空或默认图
if (empty($body)) {
return '';
}
// 匹配img标签的正则表达式
$preg = "/<img\s.*?src\s*=\s*[\"|']?(.*?)[\"|']?\s.*?>/i";
preg_match_all($preg, $body, $match);
// 如果找到了图片
if (isset($match[1][0])) {
// 返回第一张图片的src
return $match[1][0];
} else {
// 如果没有找到图片,可以返回一个默认图片地址
// 请将 '/images/default.jpg' 替换为你自己的默认图片路径
return '/images/default.jpg';
}
}
代码解释:

(图片来源网络,侵删)
- 这个函数接收一个参数
$body,也就是文章的内容。 - 使用正则表达式
preg_match_all在文章内容中查找所有<img>isset($match[1][0])判断是否找到了至少一张图片。- 如果找到了,就返回第一张图片的
src属性值。- 如果没找到,可以返回一个空字符串 ,或者返回一个你预设的默认图片路径(如
/images/default.jpg)。强烈建议使用默认图片,以避免列表页显示空白。
第二步:在列表页模板中使用
- 打开你的列表页模板文件,通常是
/templets/default/list_*.htm( 代表栏目ID)。 - 在你需要显示图片的地方,使用以下标签:
<img src="{GetFirstImg([field:body/])}" alt="[field:title/]" />
说明:
{GetFirstImg([field:body/])}这个标签的意思是:调用我们刚刚创建的GetFirstImg函数,并把当前文章的[field:body/])作为参数传递进去。alt="[field:title/]"是为了让图片的替代文本等于文章标题,这有利于SEO。
第三步:更新缓存
保存模板文件后,登录织梦后台,点击 “生成” -> “更新HTML”,选择你的列表页进行更新,这样修改才能生效。

(图片来源网络,侵删)
使用织梦自带的 array 标签(稍显复杂)
如果你不想修改PHP文件,也可以在模板文件里使用织梦的 array 循环和 preg_match 来实现。
优点:
- 无需修改PHP文件,纯模板操作。
缺点:
- 模板代码冗长,可读性差。
- 性能略低于方法一。
操作步骤:
在列表页模板中,将原来的列表循环标签 {dede:list} 或 {dede:arclist} 替换为以下代码:
{dede:arclist row='10' titlelen='50'}
<li>
<!-- 使用preg_match匹配第一张图 -->
[field:array runphp='yes']
preg_match_all('/<img.*?src="(.*?)".*?>/i', @me, $match);
if(isset($match[1][0])){
@me = $match[1][0];
}else{
@me = '/images/default.jpg'; // 默认图片
}
[/field:array]
<!-- 输出图片 -->
<img src="[field:array runphp='yes']preg_match_all('/<img.*?src="(.*?)".*?>/i', @me, $match); if(isset($match[1][0])){ @me = $match[1][0]; }else{ @me = '/images/default.jpg'; }[/field:array]" alt="[field:title/]" />
<!-- 输出标题 -->
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
代码解释:
[field:array runphp='yes']...[/field:array]是一个特殊的字段,允许在模板内执行PHP代码。preg_match_all(...)的逻辑和方法一的自定义函数完全一样。@me在这里代表[field:body/]的原始值。if(isset($match[1][0])){ @me = ... }将匹配到的图片路径或默认路径赋值给@me,这个值最终会成为<img>标签的src。
修改数据库字段(不推荐,仅作了解)
理论上,你可以修改 dede_archives 表,增加一个 litpic 或 firstimg 字段,然后在发布文章时,通过程序将第一张图片的地址存入这个字段,然后在列表标签中直接调用 [field:firstimg/]。
为什么不推荐?
- 极其繁琐:需要修改数据库、修改发布文章的程序、修改编辑器逻辑,涉及面广。
- 维护困难:升级织梦版本时,你的修改很可能会被覆盖,导致功能失效。
- 没有必要:方法一和方法二已经完美解决了这个问题,且更简单、更灵活。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 自定义函数 | 代码简洁、性能高、灵活 | 需要修改PHP文件 | ★★★★★ (强烈推荐) |
array |
无需修改PHP文件 | 模板代码冗长、性能略低 | ★★★☆☆ (备选方案) |
| 修改数据库 | 调用最直接 | 极其繁琐、维护困难 | ☆☆☆☆☆ (不推荐) |
对于绝大多数用户来说,强烈推荐使用方法一,它是一次性的简单配置,后续在所有模板中都能轻松复用,是最佳实践。
