核心概念:DedeCMS的图片存储
在调用图片之前,你需要了解DedeCMS是如何处理图片的:

(图片来源网络,侵删)
- 文章缩略图:这是最常见的方式,在后台发布文章时,可以通过“远程图片采集”或“选择本地图片”等方式,为文章设置一张缩略图,这张图片的地址会被保存在文章表 (
dede_archives) 的litpic字段中。 - 图片:图片是直接作为内容插入到文章正文 (
body字段) 中的,这些图片的地址没有被单独提取出来存储。 - 自定义字段图片:你可以为栏目或内容模型添加一个“图片”类型的自定义字段,用来存储特定的图片。
调用图片的方法主要围绕以上三种情况展开。
调用文章缩略图(最常用)
这是调用文章列表页缩略图的标准方法。
在列表页(如 index.htm, list_article.htm)中使用
DedeCMS的列表页通常通过 {dede:list} 标签来循环输出文章,在循环体内,可以使用 field 属性来获取文章的各项信息,包括缩略图。
基本语法:

(图片来源网络,侵删)
{dede:list pagesize='8'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title function='html2text(@me)'/]" />
</a>
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
</li>
{/dede:list}
代码解析:
{dede:list pagesize='8'}:开始一个循环,pagesize='8'表示每页显示8篇文章。[field:litpic/]:这是调用文章缩略图地址的核心标签,它会直接输出litpic字段中的图片URL。[field:title/]:调用文章标题。[field:arcurl/]:调用文章的完整访问链接。alt="[field:title function='html2text(@me)'/]":设置图片的alt属性,这对SEO很重要。function='html2text(@me)'是一个函数,用于去除标题中的HTML标签,防止alt属性中出现无效代码。
页(如 article_article.htm)中使用
页,可以直接使用 {dede:field} 标签来调用当前文章的缩略图。
基本语法:
<img src="{dede:field name='litpic'/}" alt="{dede:field name='title' function='html2text(@me)'}" />
代码解析:
{dede:field name='litpic'}:调用当前文章的缩略图。{dede:field name='title' function='html2text(@me)'}:调用当前文章的标题作为alt文本。
调用文章内容中的第一张图片
文章没有设置缩略图,但我们希望自动提取文章正文中的第一张图片作为缩略图,这需要使用DedeCMS的自定义函数。
在列表页调用
你需要修改列表页模板文件,使用 GetFirstImg 这个自定义函数。
基本语法:
{dede:list pagesize='8'}
<li>
<a href="[field:arcurl/]">
<!-- 如果文章有litpic,则显示litpic,否则调用正文第一张图 -->
[field:litpic runphp='yes']
if(@me != '') {
@me = '<img src="' . @me . '" alt="' . stripslashes($this->Fields['title']) . '" />';
} else {
@me = '<img src="' . GetFirstImg($this->Fields['body']) . '" alt="' . stripslashes($this->Fields['title']) . '" />';
}
[/field:litpic]
</a>
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
</li>
{/dede:list}
代码解析:
[field:litpic runphp='yes']:对litpic字段进行PHP代码处理。if(@me != ''):判断litpic字段是否为空。@me = '...':如果不为空,就生成一个标准的<img>GetFirstImg($this->Fields['body']):这是关键函数,它会从文章正文 (body) 中提取第一张图片的地址。注意: 这个函数需要确保在你的系统中被定义,DedeCMS默认会包含这个函数,如果找不到,你需要手动添加。
如何确保 GetFirstImg 函数可用?
如果提示函数未定义,请按以下步骤操作:
-
打开
/include/helpers/目录下的archive.helper.php文件。 -
在文件的最后,添加以下函数代码:
/** * 获取正文中的第一张图片路径 * @param string $body 文章内容 * @return string 图片路径,如果没有则返回空字符串 */ if (!function_exists('GetFirstImg')) { function GetFirstImg($body) { $preg = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i"; preg_match_all($preg, $body, $match); if (!empty($match[1])) { // 返回第一张图片的地址 return $match[1][0]; } return ''; // 如果没有找到图片,返回空 } } -
保存文件即可。
调用自定义字段中的图片
模型添加了一个名为 myimage 的图片类型自定义字段,调用方法如下。
在列表页调用
同样在 {dede:list} 循环内使用。
基本语法:
{dede:list pagesize='8'}
<li>
<a href="[field:arcurl/]">
<img src="[field:myimage/]" alt="[field:title function='html2text(@me)'/]" />
</a>
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
</li>
{/dede:list}
代码解析:
[field:myimage/]:直接调用名为myimage的自定义字段的值。
页调用
基本语法:
<img src="{dede:field name='myimage'/}" alt="{dede:field name='title' function='html2text(@me)'}" />
调用指定栏目或频道的图片
有时你可能想在首页某个位置调用某个特定栏目(产品展示”)的Logo或一张代表图片,这通常通过调用栏目的默认图片来实现。
基本语法:
{dede:channel type='top' row='1'}
<a href="[field:typelink/]">
<img src="[field:img/]" alt="[field:typename/]" />
</a>
{/dede:channel}
代码解析:
{dede:channel type='top' row='1'}:type='top':表示调用顶级栏目,你可以改成son(子栏目)、self(本栏目)等。row='1':只调用1个栏目。
[field:img/]:调用该栏目在后台设置的“栏目图片”。[field:typelink/]:调用该栏目的链接地址。
总结与对比
| 调用场景 | 标签/方法 | 适用模板 | 说明 |
|---|---|---|---|
| 文章缩略图 | [field:litpic/] |
列表页、内容页 | 最标准、最常用的方法。 |
| 第一张图 | GetFirstImg() 函数 |
列表页、内容页 | 作为 litpic 的备选方案,更灵活。 |
| 自定义字段图片 | [field:字段名/] |
列表页、内容页 | 需要先在内容模型中添加图片类型的字段。 |
| 栏目图片 | [field:img/] |
首页、列表页 | 调用栏目设置的代表图片,常用于导航或推荐。 |
重要提示
- 路径问题:确保你的图片路径是正确的,如果是本地上传,路径通常是
/uploads/allimg/...,如果是外部链接,则直接是完整的http://或https://地址。 - 缓存问题:修改模板后,如果页面没有变化,请到后台的“生成” -> “更新HTML”中重新生成对应的页面。
- 安全与SEO:始终为
<img>标签设置alt属性,这有助于搜索引擎理解图片内容,对SEO非常有益。
希望这份详细的指南能帮助你完全掌握在DedeCMS中调用图片的各种方法!
