核心概念:织梦的缩略图存储
要理解织梦如何处理缩略图,缩略图信息主要存储在两个地方:

- 主表 (
#@__archives):litpic字段,这个字段存储的是缩略图的完整路径,/uploads/240318/1-24031Q12345.jpg,如果文章没有上传缩略图,这个字段通常为空 。 - 附加表 (
#@__addonarticle):piclist字段,这个字段通常用于存储多图,格式是一个逗号分隔的图片路径字符串,/uploads/240318/1-24031Q12345.jpg,/uploads/240318/2-24031Q12346.jpg。
调用缩略图,本质上就是从这些字段中提取路径,并拼接成完整的 织梦系统内置了 这是最标准、最安全的方法,它会自动判断 代码示例: 代码解析: 完整展示的 上面的标签会直接输出一个完整的 进阶用法:自定义图片样式 如果你需要给图片添加自定义的CSS类、控制大小等,可以使用 注意:这种写法需要判断 你可能没有上传单张缩略图,而是在内容里上传了多图,并希望用多图的第一张作为缩略图展示。 代码示例: 代码解析: 这段PHP代码逻辑是: 这种方法非常灵活,能适应多种情况。 如果你想在多个模板中复用这个逻辑,或者需要更复杂的处理,可以创建一个自定义函数。 你可以在任何详情页模板中非常简洁地调用这个函数。 代码示例: 代码解析: 更精确的调用方式: 注意:在 直接在 上面的第二种方法,通过 这和方法二的“备用方案”类似,可以直接使用那段PHP代码,或者把它封装成一个更专门的函数。 直接在模板中使用(不推荐用于复杂逻辑,但可用): 对于绝大多数用户,直接使用方法一中的 <img>
使用系统自带标签(最推荐、最简单)
{dede:field} 标签来直接调用文章的字段,对于缩略图,推荐使用 function='GetImage...' 来处理,这样可以自动处理路径和为空的情况。调用单张缩略图(最常用)
litpic 字段是否为空,如果为空则不显示任何图片。{dede:field name='litpic' function='GetImage(@me, 1)'/}

{dede:field name='litpic'}: 调用文章主表中的 litpic 字段,获取图片路径。function='GetImage(@me, 1)': 这是一个非常重要的函数。
@me: 代表 litpic 字段的当前值(即图片路径)。GetImage(): 这是织梦系统内置的函数,用于处理图片路径。1: 是一个可选参数,表示是否启用“自动缩放”功能,通常我们不需要缩放,所以这个参数可以省略或设为0,但保留它通常无害。img<img> 标签,<img src='/uploads/240318/1-24031Q12345.jpg' alt='文章标题' width='...' height='...' style='width:; height:; border:0px;' />
style 属性。
<!-- 给图片添加一个 'thumb-img' 的CSS类,并设置最大宽度为200px -->
{dede:field name='litpic' function='GetImage(@me, 1)'}
<img src='{dede:field name='litpic'/}' alt='{dede:field.title/}' class='thumb-img' style='max-width: 200px;' />
{/dede:field}
litpic 是否为空,否则会显示一个空的 <img> 标签,方法一更简洁。调用多图中的第一张图(备用方案)
{dede:field name='array' runphp='yes'}
$dtp = new DedeTagParse();
$dtp->LoadSource(@me);
$litpic = $dtp->GetTag('litpic');
$imgurls = $dtp->GetTag('imgurls');
// 如果litpic不为空,优先使用litpic
if(!empty($litpic)) {
@me = $litpic;
}
// 如果litpic为空,则从imgurls中提取第一张
else if(!empty($imgurls)) {
preg_match_all("/<img([^>]*)\s*src=['\"]([^'\"]*)['\"][^>]*>/i", $imgurls, $matches);
if(isset($matches[2][0])) {
@me = $matches[2][0];
} else {
@me = '';
}
} else {
@me = '';
}
@me = GetImage(@me);
{/dede:field}
$array。litpic(单图)和 imgurls(多图)字段。litpic 有值,就使用它。litpic 为空但 imgurls 有值,就用正则表达式从 imgurls 字符串中解析出第一张 <img> 标签的 src 路径。GetImage() 函数处理得到的路径。@me = ... 将最终结果赋值给标签的输出。
使用自定义函数(高级、灵活)
创建自定义函数文件
include/extend.func.php 文件(如果不存在,请自行创建)。/**
* 获取文章缩略图
* 优先使用litpic,如果为空则从imgurls中获取第一张
* @param string $imgurls 文章的多图字段值
* @param string $litpic 文章的缩略图字段值
* @return string 返回处理后的图片标签或空字符串
*/
function GetArticleFirstImg($imgurls = '', $litpic = '') {
// 如果litpic不为空,优先使用litpic
if (!empty($litpic)) {
return GetImage($litpic);
}
// 如果litpic为空,则从imgurls中提取第一张
if (!empty($imgurls)) {
preg_match_all("/<img([^>]*)\s*src=['\"]([^'\"]*)['\"][^>]*>/i", $imgurls, $matches);
if (isset($matches[2][0])) {
return GetImage($matches[2][0]);
}
}
// 如果都为空,可以返回一个默认图片或者空字符串
// return '<img src="/images/default.jpg" alt="暂无图片" />';
return '';
}
在模板中调用自定义函数
{dede:field name='litpic' function='GetArticleFirstImg(@me, @me)'/}
function='GetArticleFirstImg(@me, @me)':
GetArticleFirstImg 函数。@me 传递的是 litpic 的值,作为函数的 $litpic 参数。@me 同样传递的是 litpic 的值,作为函数的 $imgurls 参数,虽然这里有点冗余,但为了函数接口的统一性,可以这样写,更精确的写法是分别获取两个字段,但这样调用最简单。{dede:field name='imgurls' function='GetArticleFirstImg(@me, dede:field name='litpic'/)'/}
function 参数里嵌套调用其他标签有时会不稳定,所以第一种传递两个 @me 的方法更常用。
常见问题与解决方案 (FAQ)
为什么我的缩略图不显示,或者显示不出来?
#@__archives 表中该文章的 litpic 字段是否为空。
uploads 目录下是否存在你调用路径的图片,可能是上传失败或图片被移动/删除了。
litpic 不要写成 lithpic 或 pic。
如何给缩略图添加CSS样式或控制尺寸?
{dede:field} 标签外面包裹一个 <img> 标签,并添加你的属性。<!-- 推荐方法:使用 function 输出完整标签,然后通过CSS控制 -->
{dede:field name='litpic' function='GetImage(@me, 1)'/}
<!-- 或者,如果你想完全控制HTML结构 -->
{dede:field name='litpic' function='str_replace("<img ", "<img class='my-class' style='max-width:100%;height:auto;' ", @me)'/}
str_replace 函数直接替换输出的 <img> 标签的字符串,添加自定义的 class 和 style。我想调用文章内容里的第一张图怎么办?
{dede:field.body runphp='yes'}
$body = @me;
preg_match_all("/<img([^>]*)\s*src=['\"]([^'\"]*)['\"][^>]*>/i", $body, $matches);
if(isset($matches[2][0])) {
@me = GetImage($matches[2][0]);
} else {
@me = ''; // 或者输出一个默认图片
}
{/dede:field}
方法
优点
缺点
适用场景
系统标签
简单、高效、官方推荐、自动处理空值
灵活性相对较低
绝大多数情况下的首选,特别是只需要调用
litpic 时。
自定义函数
灵活、可复用、逻辑清晰、功能强大
需要修改PHP文件,对新手有一定门槛
需要在多个地方调用相同逻辑,或者需要更复杂的判断(如优先级、默认图等)。
{dede:field name='litpic' function='GetImage(@me, 1)'/} 是最简单、最可靠的选择,如果遇到特殊需求,再考虑使用方法二的自定义函数。
