dede arclist如何调用原图?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 DEDE建站 正文

使用 litpic 字段(最常用、最推荐)

litpic 是文章缩略图字段,在默认情况下,如果文章没有设置缩略图,litpic 的值会是空,有一个非常巧妙的利用方式:

dede arclist 调用原图
(图片来源网络,侵删)

原理: 当你添加图集时,系统会自动将图集的第一张图片设置为该文章的缩略图(litpic),即使你手动添加了缩略图,这个技巧在很多情况下依然有效。

代码示例: 直接在 arclist 标签中使用 [field:litpic/] 即可。

{dede:arclist row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">
            <!-- 直接调用 litpic 字段,它就是原图 -->
            <img src="[field:litpic/]" alt="[field:title/]" />
        </a>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

优点:

  • 简单高效:无需额外配置,直接调用系统自带字段。
  • 性能好litpic 是文章表的一个字段,查询速度快。

适用场景:

dede arclist 调用原图
(图片来源网络,侵删)
  • 图集列表页。
  • 后台设置了“文章没有缩略图时,则调用文章内容第一张图片”的网站。

使用 body 字段配合正则表达式(最灵活、最强大)

litpic 方法不满足你的需求(你明确想从文章内容 [field:body/] 中提取第一张图片),那么可以使用自定义函数结合正则表达式。

原理: 通过 PHP 的正则表达式,从文章内容中匹配出第一个 <img> 标签的 src 属性值。

步骤 1:创建自定义函数文件include/extend.func.php 文件中(如果不存在,请自行创建),添加以下 PHP 函数代码:

/**
 * 从文章内容中提取第一张图片的地址
 * @param string $body 文章内容
 * @return string 第一张图片的地址,如果没有则返回默认图片
 */
function GetFirstImg($body)
{
    // 正则表达式匹配 img 标签的 src 属性
    $pattern = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
    preg_match_all($pattern, $body, $matches);
    // 如果找到了图片
    if (isset($matches[1][0])) {
        // 返回第一张图片的 src
        return $matches[1][0];
    } else {
        // 如果没有找到图片,可以返回一个默认图片地址,避免显示破损图标
        // return '/images/default.jpg';
        return '';
    }
}

步骤 2:在 arclist 标签中调用函数 你可以在模板文件中使用 {dede:field function='函数名(@me)'/} 的方式来调用这个函数。

dede arclist 调用原图
(图片来源网络,侵删)
{dede:arclist row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">
            <!-- 调用我们刚刚创建的函数,参数是文章内容 [field:body/] -->
            [field:body function='GetFirstImg(@me)'/]
        </a>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

注意: 上面的代码会直接输出 <img src="..."> 标签,如果你想更灵活地控制,比如添加样式或默认图片,可以修改函数的返回值,或者在外层用 <img> 标签包裹。

更完善的调用方式(推荐): 在函数中处理默认图片,并在模板中直接输出 src

修改 extend.func.php 中的函数:

// ... 函数同上,但在最后 return 时处理默认图片
    if (isset($matches[1][0])) {
        return $matches[1][0];
    } else {
        // 返回一个默认图片地址
        return '/images/no_pic.jpg'; // 请确保这个图片存在
    }

修改模板文件:

{dede:arclist row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">
            <!-- 直接调用函数获取图片地址,然后用 <img> 标签显示 -->
            <img src="[field:body function='GetFirstImg(@me)'/]" alt="[field:title/]" />
        </a>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

优点:

  • 极其灵活:可以精确控制从哪里取图,不受缩略图设置的影响。
  • 功能强大:可以轻松扩展,比如获取图片尺寸、添加水印等。

缺点:

  • 性能稍差:每次调用都需要对文章内容进行正则匹配,对于列表数据量大的网站,可能会有轻微的性能影响。
  • 需要修改文件:需要修改 extend.func.php 文件,对新手有一定门槛。

使用附加表 addonimages(专门针对图集)

如果你的文章是“图集”类型,并且数据存储在 dede_addonimages 附加表中,那么可以直接调用这个表里的图片。

原理: 图集的第一张图片通常存储在附加表的 imgurls 字段中,并且其 rank 字段为0。

代码示例: 这需要你有一定的 SQL 基础,通常结合 arclistchannelid 和底层模板来实现。

{dede:arclist row='10' channelid='1' addfields='imgurls'}
    <li>
        <a href="[field:arcurl/]">
            <!-- 解析 imgurls 字段,获取第一张图片 -->
            [field:imgurls runphp='yes']
                $dsql = new DedeSql(false);
                // 这里的逻辑需要根据你的 imgurls 字段实际格式来写
                // imgurls 是一个序列化的字符串,包含图片路径和说明
                // 以下是一个常见的解析逻辑,但可能需要调整
                $imgurls = @me;
                $preg = "/.*?<img.*?src=['|"](.+?)['|"].*?>/i";
                preg_match_all($preg, $imgurls, $matchs);
                if(isset($matchs[1][0])){
                    @me = $matchs[1][0];
                }else{
                    @me = '/images/default.jpg';
                }
            [/field:imgurls]
        </a>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

优点:

  • 数据源准确:直接从图集数据表中读取,保证是原图集中的图片。

缺点:

  • 实现复杂:需要了解附加表结构和 imgurls 的存储格式,SQL 查询和字符串处理比较麻烦。
  • 通用性差:只适用于图集模型,不适用于普通文章。

总结与建议

方法 优点 缺点 推荐场景
litpic 简单、高效、性能好 依赖后台缩略图设置,有时可能不准确 绝大多数情况下的首选,特别是图集列表。
body+正则 灵活、强大、不受缩略图影响 性能稍差,需要修改PHP文件 当你需要强制从文章内容中提取图片时,或者 litpic 无法满足需求时。
addonimages 数据源准确,专为图集设计 实现复杂,通用性差 仅当你需要精确调用图集附加表中的图片,且不满足其他方法时。

给你的最终建议:

  1. 首先尝试方法一 (litpic),这是最简单、最符合 DedeCMS 设计逻辑的方式,能解决80%以上的问题。
  2. 如果方法一的结果不符合你的预期(比如你发现 litpic 不是你想要的原图),再使用方法二 (body+正则),这是最可靠、最灵活的通用方案。
  3. 方法三 除非你有特殊需求,否则一般不推荐使用,因为它太复杂了。

希望这个详细的解释能帮助你解决问题!

-- 展开阅读全文 --
头像
dede plus view静态如何生成与配置?
« 上一篇 2025-12-18
C语言结构体如何定义与使用?
下一篇 » 2025-12-18

相关文章

取消
微信二维码
支付宝二维码

目录[+]