解决这个问题主要有两种方法,强烈推荐使用第一种方法,因为它更灵活、更规范。

修改模板文件(推荐,最规范、最灵活)
这是最推荐的方法,因为它不会修改程序核心文件,升级网站时不会被覆盖,并且可以精确控制每篇文章的缩略图。
核心思路:
DedeCMS的文章模型中,有一个专门的字段 litpic 用于存储文章的缩略图,我们只需要在首页模板的循环标签中,调用这个 litpic 字段即可,而不是调用文章内容里的图片。
操作步骤:
-
登录后台,进入“模板” -> “默认模板管理”。
-
找到你当前使用的模板,点击“主页模板”后面的“修改”。
(图片来源网络,侵删) -
在模板代码中,找到文章列表的循环标签,通常是
{dede:arclist}。 -
关键一步:在
{dede:arclist}标签内,必须加上litpic='yes'这个属性,这个属性会强制DedeCMS为列表中的每篇文章生成或获取缩略图。修改前的代码可能类似这样:
{dede:arclist typeid='1' row='8'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:arclist}修改后,应该加上
litpic='yes':{dede:arclist typeid='1' row='8' litpic='yes'} ... {/dede:arclist}注意:即使你没有在后台为文章上传缩略图,设置了
litpic='yes',DedeCMS也会尝试从文章内容里提取第一张图片作为litpic,但这正是我们想要避免的!所以接下来的步骤至关重要。 -
在循环内部,调用
[field:litpic/]来显示缩略图。完整的、规范的调用代码示例:
<ul class="news-list"> {dede:arclist typeid='1' row='6' titlelen='30' litpic='yes'} <li> <!-- 调用自定义的缩略图,而不是内容图 --> <a href="[field:arcurl/]" class="img-box"> <img src="[field:litpic/]" alt="[field:title function='html2text(@me)'/]"> </a> <div class="text-box"> <h3><a href="[field:arcurl/]">[field:title/]</a></h3> <p class="intro">[field:description function='cn_substr(@me, 100)'/]...</p> </div> </li> {/dede:arclist} </ul>[field:litpic/]:这就是调用文章自定义缩略图的字段。[field:title function='html2text(@me)'/]:给img标签的alt属性赋值,使用标题并过滤HTML标签,有利于SEO。[field:description/]:调用文章摘要。
-
更新并生成首页,在后台点击“生成” -> “主页HTML生成”,更新你的首页文件。
总结一下方法一:
模板标签 {dede:arclist} 加上 litpic='yes',在内部用 [field:litpic/] 调用图片。
这样,只要你在后台发布文章时上传了缩略图,首页就会调用你上传的图;如果你没上传,它就不会显示任何图片(或者你可以通过CSS设置默认占位图),而绝对不会去调用内容页里的图。
修改程序文件(不推荐,有风险)
这种方法通过修改DedeCMS的核心文件,来改变其默认行为。缺点是:当你升级DedeCMS版本时,这些修改会被覆盖,需要重新修改,非常麻烦。
核心思路:
找到并修改负责处理 {dede:arclist} 标签的PHP文件,让它在获取缩略图时,优先使用 litpic 字段,而不是从内容 body 中提取。
操作步骤:
-
找到核心文件: 用FTP或服务器文件管理工具,进入你的DedeCMS安装目录,找到文件:
/include/taglib/arclist.lib.php -
编辑并修改文件: 用代码编辑器(如VS Code, Sublime Text, Notepad++)打开
arclist.lib.php文件。 -
定位关键代码: 在文件中搜索关键词
GetImage,你会找到类似下面这样的代码块(版本不同,行号可能略有差异):// ... 前面代码 ... if($row['litpic'] == '-' || $row['litpic'] == ''){ $row['litpic'] = $GLOBALS['cfg_cmspath'].'/images/defaultpic.gif'; } // ... 中间代码 ... // 下面这行是关键,它负责从内容里提取图片 $row['pic'] = GetImage($row['body'], $litpic_width, $litpic_height); // ... 后面代码 ... -
修改逻辑: 我们需要修改这个逻辑,让它只在没有
litpic的时候才去body里找,修改如下:// ... 前面代码 ... // 如果文章没有设置缩略图,则使用默认图 if($row['litpic'] == '' || $row['litpic'] == '-'){ $row['litpic'] = $GLOBALS['cfg_cmspath'].'/images/defaultpic.gif'; // 只有在没有litpic的情况下,才尝试从内容里提取 $row['pic'] = GetImage($row['body'], $litpic_width, $litpic_height); } else { // 如果有litpic,就直接用litpic,不再去body里找 $row['pic'] = $row['litpic']; } // ... 后面代码 ... -
保存文件,并确保文件权限正确(通常是644)。
总结一下方法二:
修改 /include/taglib/arclist.lib.php 文件,调整 GetImage 函数的调用逻辑,使其优先使用 litpic 字段。
最佳实践与建议
- 首选方法一:它更安全、更灵活,符合模板与逻辑分离的原则。
- 缩略图上传:在后台发布文章时,务必记得上传“缩略图”,这是确保首页显示正确图片的根本。
- 默认图片:在后台“系统” -> “系统基本参数” -> “附件设置”中,可以设置“默认缩略图”,当文章没有上传缩略图时,会自动显示这个默认图,避免页面空白。
- 清理缓存:修改模板或程序后,记得在后台清理一下缓存,然后重新生成首页,才能看到效果。
希望这个详细的解答能帮助你解决问题!
