这个问题非常经典,因为DedeCMS为了性能,默认上传图片后会生成多个尺寸的版本,如:

- 原图:
uploads/images/2025/10/10/a.jpg - 大图:
uploads/images/2025/10/10/a_l.jpg(大图,-l) - 小图:
uploads/images/2025/10/10/a_s.jpg(缩略图,-s) - 中图:
uploads/images/2025/10/10/a_m.jpg(中图,-m) - 幻灯片图:
uploads/images/2025/10/10/a_lp.jpg(幻灯片图,-lp)
你提到的 replace -lp,核心目标就是:在需要显示大图的地方,获取一个不带 -lp 后缀的、尺寸最大的图片地址(通常是原图或大图)。
下面我将提供几种从易到难、从简单到彻底的解决方案。
使用 {dede:field.litpic function='str_replace("-lp", "", @me)'/} (最直接)
这是最简单、最快速的方法,直接在模板标签里使用PHP的 str_replace 函数进行字符串替换。
适用场景:当你确定缩略图地址中一定有 -lp 后缀,并且你只想简单地把它去掉,得到一个可能接近原图的地址时。

使用方法:
在你需要调用图片的地方,将默认的 {dede:field name='litpic'/} 替换为以下代码:
{dede:field.litpic function='str_replace("-lp", "", @me)'/}
代码解析:
{dede:field.litpic}:获取文章的缩略图地址。function='...':对获取到的值(@me)执行一个PHP函数。str_replace("-lp", "", @me):这是一个PHP函数,作用是@me(即litpic的值)中,查找"-lp"这个字符串,并将其替换为空字符串 ,也就是删除它。
优点:

- 简单,一行代码搞定。
- 无需修改程序文件,升级网站时不受影响。
缺点:
- 不够“智能”,如果缩略图是
-l.jpg或-s.jpg,这个方法就无效了。 - 它只是删除了后缀,如果原图本身就不是
-lp版本,你可能得到的是错误的图片。
使用自定义函数 GetOriginalImage() (最推荐,最灵活)
这是最规范、最强大的方法,通过创建一个自定义函数,我们可以精确地获取到原图地址,无论缩略图是什么后缀。
适用场景:任何需要精确调用原图的场景,特别是网站图片质量要求高,或者有图集、画廊等功能时。
操作步骤:
第1步:创建自定义函数文件
- 打开
/include/extend.func.php文件,如果这个文件不存在,请自己创建一个。 - 在文件末尾的
?>之前,添加以下PHP函数代码:
/**
* 获取DedeCMS文章的原图地址
* @param string $litpic 文章的缩略图地址
* @return string 原图地址
*/
function GetOriginalImage($litpic)
{
// 如果地址为空,返回空
if (empty($litpic)) {
return '';
}
// 定义可能的后缀数组
$suffixes = array('_lp', '_l', '_m', '_s', '.jpg', '.jpeg', '.png', '.gif', '.bmp');
// 遍历后缀,并从地址中移除
foreach ($suffixes as $suffix) {
$pos = strrpos($litpic, $suffix);
if ($pos !== false && $pos == strlen($litpic) - strlen($suffix)) {
$litpic = substr($litpic, 0, $pos);
break; // 找到一个后缀并移除后就停止循环
}
}
// 返回处理后的地址
return $litpic;
}
函数解析:
这个函数会从缩略图地址的末尾开始,依次检查是否存在 _lp, _l, _m, _s 等常见后缀,一旦找到,就将其截断,并立即停止,这样能最大程度地还原出原图的路径。
第2步:在模板中调用函数
你可以在任何模板文件中,使用 function 属性来调用这个新函数了。
{dede:field name='litpic' function='GetOriginalImage(@me)'/}
代码解析:
{dede:field name='litpic'}:获取缩略图地址。function='GetOriginalImage(@me)':将获取到的地址@me作为参数,传递给我们刚刚创建的GetOriginalImage()函数。
优点:
- 精准:能智能识别多种后缀,获取到最接近原图的地址。
- 灵活:函数可以统一管理,修改逻辑时只需改一处。
- 规范:符合DedeCMS的扩展机制,是官方推荐的做法。
- 可复用:其他需要调用原图的地方也可以直接使用这个函数。
缺点:
- 需要修改
/include/extend.func.php文件,如果网站升级时这个文件被覆盖,需要重新添加。
修改DedeCMS核心文件 (不推荐,风险高)
这个方法会直接修改DedeCMS生成HTML代码时的底层逻辑,让它默认就调用原图。
警告:此方法有风险!修改核心文件后,将无法通过DedeCMS的“一键升级”功能来更新系统,必须手动备份和还原修改过的文件,请谨慎操作。
操作步骤:
- 找到并打开
/include/arc.archives.class.php文件,这个文件是处理文章列表、文章内容等生成逻辑的核心类。 - 在文件中搜索
GetLitpic()函数。 - 找到类似下面的代码块(版本不同,代码行数可能略有差异):
// 在 arc.archives.class.php 中
function GetLitpic($flag='',$strUrl='')
{
if($this->Fields['litpic'] == '')
{
return $this->Fields['picname'];
}
if($strUrl=='')
{
$litpic = $this->Fields['litpic'];
}
else
{
$litpic = $strUrl.'/'.$this->Fields['litpic'];
}
// --- 这部分是关键 ---
if($flag=='')
{
$objUrl = new DedeUrl();
$litpic = $objUrl->GetFullUrl($litpic);
}
else
{
$litpic = trim($litpic);
}
// --- 关键部分结束 ---
return $litpic;
}
- 修改
return $litpic;之前的逻辑,我们可以在这里调用我们方案二中创建的函数。
// 在 arc.archives.class.php 中修改 GetLitpic() 函数
function GetLitpic($flag='',$strUrl='')
{
if($this->Fields['litpic'] == '')
{
return $this->Fields['picname'];
}
if($strUrl=='')
{
$litpic = $this->Fields['litpic'];
}
else
{
$litpic = $strUrl.'/'.$this->Fields['litpic'];
}
// --- 修改这里的逻辑 ---
// 引入自定义函数文件(如果extend.func.php没有被自动引入,可能需要 require_once(DedeINC.'/extend.func.php');)
// 然后调用函数获取原图
$litpic = GetOriginalImage($litpic);
// --- 修改结束 ---
if($flag=='')
{
$objUrl = new DedeUrl();
$litpic = $objUrl->GetFullUrl($litpic);
}
else
{
$litpic = trim($litpic);
}
return $litpic;
}
优点:
- 一劳永逸,所有使用
{dede:field.litpic}的地方都会自动变成原图。 - 影响范围广。
缺点:
- 高风险:修改核心文件,破坏程序完整性。
- 升级困难:每次DedeCMS官方发布新版本,都需要手动重新修改这个文件。
- 可能影响其他功能:
GetLitpic函数在别处有特殊用途,可能会被意外影响。
总结与建议
| 方案 | 优点 | 缺点 | 推荐指数 |
|---|---|---|---|
方案一: str_replace |
简单快速,无需改文件 | 不智能,仅适用于特定后缀 | ★★☆☆☆ |
| 方案二: 自定义函数 | 精准、灵活、规范、可复用 | 需修改 extend.func.php,升级需注意 |
★★★★★ |
| 方案三: 修改核心文件 | 一劳永逸,全局生效 | 高风险、升级困难、破坏程序 | ★☆☆☆☆ |
强烈推荐使用方案二:自定义函数 GetOriginalImage()。
它完美地平衡了功能性、安全性和可维护性,是解决此类问题的最佳实践,只需一次小小的添加,就能让你的网站图片调用逻辑变得非常健壮。
