织梦列表页无图显示默认图片
织梦列表页在展示图文列表时,如果文档没有上传缩略图,litpic 字段会是空的或返回 /images/defaultpic.gif,前端就会出现破图或一片空白。要让它优雅地显示一张默认占位图,有模板判断、SQL 过滤、JS 兜底几种思路,下面分别说明。
一、问题原因分析
织梦在文档未上传缩略图时,dede_archives 表的 litpic 字段默认写入 /images/defaultpic.gif。但有两种情况会偏离预期:
- 采集或批量导入的文档,
litpic可能是空字符串'' - 迁移服务器后默认图路径变了,原
defaultpic.gif不存在 - 自定义模型没有继承默认图逻辑,字段直接为 NULL
所以单纯靠系统默认值并不稳妥,需要在模板层做一次判断。
二、方案一:模板标签 runphp 判断
这是最推荐的做法,在 list 或 arclist 标签里用 runphp="yes" 对 litpic 做判断:
{dede:arclist row="10" typeid="5"}
<li>
[field:array runphp="yes"]
if(empty(@me['litpic']) || @me['litpic']=='/images/defaultpic.gif'){
@me['litpic']='/images/no-img.png';
}
[/field:array]
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]">
</a>
</li>
{/dede:arclist}
核心逻辑:[field:array] 把整行数据作为数组传入,@me['litpic'] 取缩略图字段,为空或等于系统默认图时替换成自定义占位图。
更简洁的写法
[field:litpic runphp="yes"]
if(@me=='' || @me=='/images/defaultpic.gif'){
@me='/images/no-img.png';
}
[/field:litpic]
这种写法只针对单字段,不用调 array,性能更好。
三、方案二:SQL 标签里直接判断
用 dede:sql 自定义查询时,可以在 SQL 层用 IF 或 CASE 处理:
{dede:sql sql="SELECT
id,title,
IF(litpic='' OR litpic='/images/defaultpic.gif',
'/images/no-img.png',litpic) AS litpic,
typedir
FROM dede_archives WHERE typeid=5 ORDER BY id DESC LIMIT 10"}
<a href="[field:typedir/]/[field:id/].html">
<img src="[field:litpic/]">[field:title/]
</a>
{/dede:sql}
好处是数据库层就处理好,模板里直接输出,不依赖织梦标签引擎,渲染速度更快。
四、方案三:前端 JS 兜底
如果不想动模板,可以在页面底部加一段 JS,对所有 img 的 onerror 做兜底:
<script>
document.querySelectorAll('img[data-src]').forEach(function(img){
img.onerror=function(){
this.src='/images/no-img.png';
this.onerror=null;
};
});
</script>
配合 img 标签加 data-src 属性使用。这种方案对动态加载的内容也有效,但依赖 JS 执行,爬虫抓取时可能仍看到破图,对 SEO 不友好,不建议作为首选。
五、默认图片的尺寸与样式处理
占位图最好和真实缩略图保持相同比例,否则列表会出现高度跳变。建议:
- 占位图尺寸与
arclist里img标签的 width/height 一致 - CSS 里给
img设object-fit:cover防止变形 - 占位图用纯色背景 + 文字提示(如“暂无图片”),视觉上不突兀
.list-img img{
width:200px;
height:140px;
object-fit:cover;
background:#f5f5f5;
}
六、修改系统默认图路径
如果不想逐个模板改,可以直接替换系统默认图。打开 /images/defaultpic.gif,用同名文件覆盖即可。但要注意:
/images/ 目录可能被覆盖,自定义默认图会丢失。建议把改动后的图备份一份,或直接在模板里写死路径更稳妥。也可以改系统参数:后台 → 系统设置 → 系统基本参数 → 附件设置里,把“缩略图默认图片”改成自定义路径(部分版本不支持此项,需看具体版本)。
七、注意事项
runphp标签里不能用单引号包裹含单引号的字符串,字符串里有斜杠要注意转义- 列表页用
list标签时同样支持runphp,写法一致 - 动态浏览模式下
runphp性能略低,建议开启页面缓存 - 如果用了自定义模型,
litpic字段名可能不同,需对应改成实际字段名
把默认图兜底逻辑统一封装进公共模板片段(如 list_item.htm),全站列表位 include 引用,后续换占位图只改一处即可。这个细节看似小,却直接影响列表页的视觉完整度,值得在模板开发初期就规划好。