后台手动添加(最常用、最直接)
这是最基础也是最灵活的方法,通过修改文章模型,增加一个专门的“自定义缩略图”字段。

操作步骤:
-
进入后台 -> 附加设置 -> 内容模型管理
找到你正在使用的文章模型(通常是“文章”),点击后面的“字段管理”。
-
添加新字段
- 点击“添加新字段”按钮。
- 字段名称:
litpic(这是织梦默认缩略图字段名,如果只是想增加一个不影响原流程的,可以起个新名,如custom_thumb) - 字段类型:
多媒体(这个类型可以直接调用上传器,非常方便) - 字段提示:
自定义缩略图(在后台发布文章时,这里会显示提示文字) - 是否显示在发布页:
是(务必选择是,否则后台发布文章时看不到这个输入框) - 其他选项:保持默认即可。
-
保存并更新缓存
(图片来源网络,侵删)- 点击“保存”按钮。
- 系统会提示你“更改模型字段,请更新缓存以确保正常使用!”,点击“确定”或手动去“系统 -> 数据库备份/还原”里执行“一键更新网站缓存”。
-
发布文章时使用
- 现在去发布一篇新文章,你会发现文章编辑页多了一个“自定义缩略图”的选项。
- 点击上传按钮,选择你想要的图片即可。
-
在前端模板中调用
- 如果你用的是新的字段名
custom_thumb,在模板中调用方式如下:{dede:field.custom_thumb /} - 如果你直接用了默认的
litpic字段,那么它就会覆盖掉系统自动提取的缩略图,调用方式和原来一样:<img src="{dede:field.litpic /}" alt="{dede:field.title /}" />
- 如果你用的是新的字段名
优点:
- 完全可控,可以精确指定任何图片作为缩略图。
- 不需要修改核心文件,升级时无忧。
缺点:

- 每篇文章都需要手动上传,对于批量导入的文章来说比较麻烦。
修改 arc.archives.class.php 文件(自动提取,但优先级更高)
这个方法的核心是修改织梦的底层解析类,让它在获取缩略图时,优先检查文章内容中是否有你指定的特定格式(比如一个带有特定class的img标签),如果有,就使用这张图,否则再走原来的逻辑。
操作步骤:
-
找到并修改文件
- 文件路径:
/include/arc.archives.class.php - 用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开这个文件。
- 文件路径:
-
定位关键函数
- 搜索函数
GetLitPic(),这个函数就是用来获取文章缩略图的。 - 在这个函数里,找到处理文章内容正则匹配的代码段,通常在函数的末尾。
- 搜索函数
-
修改代码逻辑
-
原来的代码大概是这样(简化版):
// ... 其他代码 ... if($row['litpic'] != '' && !preg_match("#^http://#", $row['litpic']) && $GLOBALS['cfg_multi_site'] != 'N') { $row['litpic'] = $GLOBALS['cfg_basehost'].$row['litpic']; } return $row['litpic']; -
我们需要在这段代码之前加入我们的自定义逻辑。
-
修改后的代码示例(在
return $row['litpic'];之前添加):// 在 return $row['litpic']; 之前添加以下代码
// 【自定义逻辑开始】 // 如果文章内容不为空,并且还没有设置litpic(或者你想覆盖已有litpic) if (empty($row['litpic']) || $your_priority_rule) { $body = $row['body']; // 获取文章内容 // 使用正则表达式查找带有特定 class 的图片,class="custom-thumb" // preg_match_all('/<img\s+[^>]?class\s=\s[\'"](.?custom-thumb.?)[\'"][^>]?src\s=\s\'"[\'"][^>]*?>/i', $body, $matches);
// 更简单的,只查找第一个 img 标签的 src preg_match_all('/<img\s+[^>]*?src\s*=\s*[\'"]([^\'"]*?)[\'"][^>]*?>/i', $body, $matches); if (isset($matches[1]) && !empty($matches[1])) { // 取第一张图片 $first_img = $matches[1][0]; // 如果是相对路径,转为绝对路径 if ($first_img && !preg_match("#^http://#", $first_img) && $GLOBALS['cfg_multi_site'] != 'N') { $first_img = $GLOBALS['cfg_basehost'] . $first_img; } $row['litpic'] = $first_img; // 将找到的图片地址赋值给 litpic }} // 【自定义逻辑结束】
// 原来的代码 if($row['litpic'] != '' && !preg_match("#^http://#", $row['litpic']) && $GLOBALS['cfg_multi_site'] != 'N') { $row['litpic'] = $GLOBALS['cfg_basehost'].$row['litpic']; } return $row['litpic'];
* **代码解释**: * 这段代码会首先检查文章内容 `body`。 * 使用正则表达式 `<img\s+[^>]*?src\s*=\s*[\'"]([^\'"]*?)[\'"][^>]*?>` 来匹配文章中的所有 `<img>` 标签,并提取其 `src` 属性。 * 如果找到了图片,就把第一张图片的地址赋值给 `$row['litpic']`。 * 系统会返回这个新的 `$row['litpic']`。 -
-
保存文件并测试
- 保存修改后的
arc.archives.class.php文件。 - 访问一篇有图片但没有后台缩略图的文章,看看首页或列表页是否正确显示了内容中的第一张图。
- 保存修改后的
优点:
- 完全自动化,无需手动操作。
- 不需要修改文章模型,对现有文章无影响。
缺点:
- 需要修改核心文件,织梦升级时可能会被覆盖,需要重新修改。
- 灵活性较低,只能按照固定的规则(如取第一张图)来执行。
结合方法一和方法二(最佳实践)
这是最推荐的方法,结合了手动控制的灵活性和自动提取的便利性。
逻辑顺序:
- 优先使用后台自定义的缩略图(即
litpic字段有值)。 - 如果后台没有,则自动从文章内容中提取第一张图片。
- 如果都没有,则显示一个默认的“无图”占位图。
如何实现:
你只需要使用方法二中修改 arc.archives.class.php 的代码,但需要微调一下逻辑。
修改后的 GetLitPic() 函数逻辑:
// 在 arc.archives.class.php 的 GetLitPic() 函数中,修改如下:
// ... 函数开始部分 ...
// 【自定义逻辑开始】
// 1. 优先检查 litpic 字段是否已有值(即后台是否设置了自定义图片)
if (empty($row['litpic'])) {
// 2. litpic 为空,则尝试从文章内容中提取
$body = $row['body'];
// 匹配所有图片
preg_match_all('/<img\s+[^>]*?src\s*=\s*[\'"]([^\'"]*?)[\'"][^>]*?>/i', $body, $matches);
if (isset($matches[1]) && !empty($matches[1])) {
// 取第一张图片
$first_img = $matches[1][0];
// 处理相对路径
if ($first_img && !preg_match("#^http://#", $first_img) && $GLOBALS['cfg_multi_site'] != 'N') {
$first_img = $GLOBALS['cfg_basehost'] . $first_img;
}
$row['litpic'] = $first_img; // 赋值
} else {
// 3. 如果内容中也没有图片,则设置一个默认的“无图”图片
$row['litpic'] = '/images/default.jpg'; // 请确保这个默认图片路径存在
}
}
// 【自定义逻辑结束】
// 原来的代码,处理绝对路径
if($row['litpic'] != '' && !preg_match("#^http://#", $row['litpic']) && $GLOBALS['cfg_multi_site'] != 'N')
{
$row['litpic'] = $GLOBALS['cfg_basehost'].$row['litpic'];
}
return $row['litpic'];
// ... 函数结束部分 ...
前端模板调用(带默认图): 为了确保万无一失,在模板中也最好加上默认图。
<img src="{dede:field.litpic runphp='yes'}
if(@me == '') @me = '/images/default.jpg';
else @me = @me;
{/dede:field.litpic}" alt="{dede:field.title /}" />
或者更简单的方式(PHP逻辑在后台处理了,前端直接调用):
<img src="{dede:field.litpic /}" alt="{dede:field.title /}" />
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 后台添加字段 | 灵活可控,不修改核心文件 | 需手动上传每篇文章图片 | 对图片有特殊要求、内容质量高的网站 |
| 修改核心文件 | 完全自动化,无需手动 | 修改核心文件,升级易丢失 | 图片要求统一,文章数量庞大的站点 |
| 最佳实践 | 兼具灵活与自动,体验好 | 需修改核心文件 | 绝大多数网站的首选 |
对于大多数网站,我强烈推荐方法三,它为站长提供了最终的控制权(后台可随时覆盖),同时又为没有手动设置的文章提供了良好的自动回退机制,大大提升了网站的自动化程度和用户体验。
