前台模板中,当图片不存在时显示默认图或文字
这是最常见的需求,比如在列表页、内容页,如果文章里的图片地址失效了,我们不希望显示一个破碎的图片图标(一个带叉的小方块),而是希望显示一个默认的图片或者一段文字。

(图片来源网络,侵删)
方法1:使用 dede:field 标签的 function 属性(推荐)
这是最灵活、最常用的方法,我们可以通过一个自定义的PHP函数来处理图片路径。
步骤:
-
在
include/helpers/image.helper.php文件中添加自定义函数打开你的DedeCMS安装目录下的
include/helpers/image.helper.php文件,在文件末尾添加以下PHP函数:
(图片来源网络,侵删)/** * 检查图片是否存在,如果不存在则返回默认图片 * @param string $imgUrl 图片地址 * @param string $defaultImg 默认图片地址(相对于网站根目录) * @return string */ function CheckAndReplaceImg($imgUrl, $defaultImg = '/images/default.jpg') { // 如果图片地址为空,直接返回默认图 if (empty($imgUrl)) { return $defaultImg; } // 如果是站内图片,检查文件是否存在 // 使用@抑制函数可能产生的警告,比如权限问题 if (@file_exists(DEDEROOT . $imgUrl)) { return $imgUrl; } // 如果是站外图片(http开头的),通常无法直接检查文件存在性,我们直接返回原地址 // 或者你也可以在这里强制返回默认图,取决于你的需求 if (strpos($imgUrl, 'http') === 0) { // return $imgUrl; // 返回远程图片地址 return $defaultImg; // 或者直接返回默认图 } // 其他情况(如图片不存在),返回默认图 return $defaultImg; }说明:
DEDEROOT是 DedeCMS 定义的全局变量,代表网站根目录的物理路径。- 你需要先创建一个默认图片,
images/default.jpg,并确保它存在于你的网站根目录下。 - 这个函数会检查图片路径是否为空,以及文件是否真实存在。
-
在模板文件中使用
function调用该函数假设你想在文章列表页(
list_article.htm图片上使用这个功能。<a href="[field:arcurl/]"> <img src="{dede:field.litpic function='CheckAndReplaceImg(@me, "/images/nopic.jpg")'/}" alt="[field:title function='html2text(@me)'/]" /> </a>代码解析:
(图片来源网络,侵删){dede:field.litpic}:获取文章的缩略图地址。function='CheckAndReplaceImg(@me, "/images/nopic.jpg")':function:告诉DedeCMS要对这个字段进行处理。CheckAndReplaceImg:是我们刚刚在image.helper.php中定义的函数名。@me:是DedeCMS的固定用法,代表当前标签的原始值,也就是{dede:field.litpic}的值。"/images/nopic.jpg":是我们传递给函数的第二个参数,即默认图片路径。
- 这样,
litpic指向的图片不存在,src的值就会自动变成/images/nopic.jpg。
方法2:使用 JavaScript 在前端处理(不推荐,但可行)
这种方法是在图片加载失败时,用JavaScript替换它。
在模板的 <head> 部分或底部加入以下JS代码:
<script>
// 为所有带有 'replace-img' 类的图片添加错误处理
document.addEventListener("DOMContentLoaded", function() {
var images = document.getElementsByTagName('img');
for (var i = 0; i < images.length; i++) {
// 你可以给需要处理的图片加上一个特定的 class,class="replace-img"
// 或者直接处理所有图片
images[i].onerror = function() {
// 这里设置你的默认图片路径
this.src = "/images/nopic.jpg";
// (可选) 你还可以移除图片的onerror事件,防止无限循环
this.onerror = null;
};
}
});
</script>
然后在需要处理的 <img> 标签上,你可以不加任何特殊处理,它会自动生效,或者为了性能,只给特定图片加:
<img src="[field:litpic/]" class="replace-img" alt="..." />
缺点:
- 用户会先看到一张破碎的图片,然后图片才闪烁一下变成默认图,体验不佳。
- 增加了前端负担,不如后端处理直接。
后台编辑器中,当图片不存在时
在后台编辑文章时,如果引用的图片已经失效(比如从其他网站复制过来的,且原站已删除),编辑器里同样会显示一个破碎的图标,这虽然不影响前台显示(如果你用了方法一),但在后台编辑时很不方便。
解决方案:安装“图片本地化”或“一键检测替换”插件
DedeCMS的官方或第三方市场有很多此类插件,它们的功能通常包括:
- 一键检测文章中的无效图片:扫描文章内容,找出所有无法访问的图片链接。
- 一键替换为默认图片:将所有无效图片批量替换为你设定的默认图片。
- 图片本地化:将外链图片下载到你的服务器,并自动替换为本地链接,一劳永逸。
如何寻找和使用:
- 登录DedeCMS后台。
- 进入“模块” -> “模块库”。
- 在搜索框中搜索关键词,如“图片检测”、“图片替换”、“内容检测”等。
- 找到合适的插件后,下载、安装并启用。
- 根据插件的说明文档,在后台设置好默认图片路径,然后就可以在内容管理页面使用插件的功能了。
这种方法是专门针对后台编辑优化的,效率很高。
总结与推荐
| 场景 | 推荐方案 | 优点 | 缺点 |
|---|---|---|---|
| 前台显示 | 方法1:PHP function 函数 |
体验最好,用户永远不会看到破碎图片。 逻辑清晰,在服务端完成处理。 灵活可控,可以自定义复杂的判断逻辑。 |
需要修改核心文件(image.helper.php),升级Dede时可能需要重复修改。 |
| 后台编辑 | 安装专用插件 | 效率高,可批量处理所有文章。 功能强大,不仅能处理不存在图片,还能处理外链等问题。 不涉及代码,对普通用户更友好。 |
需要寻找和安装第三方插件,可能存在兼容性风险。 |
给你的最终建议:
- 对于前台显示,强烈推荐使用 方法1(PHP函数),这是最专业、最可靠的解决方案。
- 对于后台编辑,可以去寻找并安装一个 图片检测/替换插件,这样能大大提高你维护网站内容的效率。
通过以上两种方式,你就可以完美解决 DedeCMS 中图片不存在时的问题了。
