dede图片名怎么调用?

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

使用 {dede:field.body} + 自定义函数(最推荐、最灵活)

这是最强大和最灵活的方法,因为它可以处理文章内容中的任意图片,而不仅仅是缩略图,它的核心思路是:

  1. 先用 {dede:field.body} 获取文章的完整内容。
  2. 在模板文件中引入一个自定义的PHP函数。
  3. 在模板里调用这个函数,并传入文章内容,函数会返回处理后的图片名称。

步骤详解:

创建自定义函数文件

在你的网站根目录下,找到 include/extend.func.php 文件,如果这个文件不存在,就自己新建一个,在这个文件里添加下面的PHP代码:

/**
 * 获取文章内容中的第一张图片的文件名
 * @param string $body 文章内容
 * @return string 图片的文件名(不带后缀)或空字符串
 */
function GetFirstImgName($body)
{
    // 匹配 img 标签的正则表达式
    $pattern = '/<img\s[^>]*?src\s*=\s*['"]?([^"'\s>]+)['"]?[^>]*>/i';
    preg_match_all($pattern, $body, $matches);
    if (isset($matches[1]) && !empty($matches[1])) {
        // 获取第一个图片的 src
        $first_img_src = $matches[1][0];
        // 从 src 中提取文件名
        $img_path_info = pathinfo($first_img_src);
        // 返回不带后缀的文件名,如果需要带后缀,可以返回 $img_path_info['basename']
        return $img_path_info['filename'];
    }
    return '';
}
/**
 * 获取文章内容中所有图片的文件名(逗号分隔)
 * @param string $body 文章内容
 * @return string 图片文件名列表(逗号分隔)
 */
function GetAllImgNames($body)
{
    $pattern = '/<img\s[^>]*?src\s*=\s*['"]?([^"'\s>]+)['"]?[^>]*>/i';
    preg_match_all($pattern, $body, $matches);
    $img_names = [];
    if (isset($matches[1]) && !empty($matches[1])) {
        foreach ($matches[1] as $src) {
            $img_path_info = pathinfo($src);
            $img_names[] = $img_path_info['filename']; // 同样,这里返回不带后缀的文件名
        }
    }
    return implode(',', $img_names);
}

在文章列表页或内容页调用

打开你的列表页模板(如 list_article.htm页模板(如 article_article.htm)。

示例:获取文章第一张图片的名称

在需要显示图片名称的地方,插入以下代码:

{dede:field.body function='GetFirstImgName(@me)'/}

代码解释:

  • {dede:field.body}:获取文章内容。
  • function='...':这是一个函数调用标记。
  • @me:这是一个特殊变量,代表 {dede:field.body} 标签本身获取到的值(也就是文章内容全文)。
  • GetFirstImgName(@me):将文章内容全文作为参数,传递给我们刚刚在 extend.func.php 中定义的 GetFirstImgName 函数。

示例:获取文章所有图片的名称(用逗号分隔)

{dede:field.body function='GetAllImgNames(@me)'/}

直接使用 field 标签调用缩略图名称(仅适用于缩略图)

如果你的需求仅仅是调用文章设置的“缩略图”的文件名,而不是文章内容里的任意图片,那么可以直接使用 litpic 字段。

在列表页调用

在列表页模板(如 list_article.htm)中:

{dede:list}
    <li>
        <!-- 获取缩略图的完整路径,/uploads/2025/10/01/abc.jpg -->
        <img src="[field:litpic/]" alt="[field:title/]">
        <!-- 获取缩略图的文件名,abc.jpg -->
        <p>缩略图文件名: [field:litpic function='(@me)'/]</p>
        <!-- 获取不带后缀的文件名,abc -->
        <p>缩略图文件名(无后缀): [field:litpic function='pathinfo(@me)["filename"]'/]</p>
    </li>
{/dede:list}

代码解释:

  • [field:litpic/]:直接调用缩略图的完整路径。
  • [field:litpic function='(@me)'/]:这里 function 的用法有点特殊,因为 litpic 已经是字符串了,@me 就是这个字符串,这个写法等同于直接输出 [field:litpic/]
  • [field:litpic function='pathinfo(@me)["filename"]'/]:这是调用了PHP内置的 pathinfo() 函数。pathinfo() 会解析一个路径,返回一个包含 dirname, basename, extension, filename 等信息的数组,我们取其中的 filename 键值,就可以得到不带后缀的文件名。

页调用 页模板(如 article_article.htm)中,用法和列表页完全一样:

<img src="{dede:field name='litpic'/}" alt="{dede:field.title/}">
<p>缩略图文件名(无后缀): {dede:field name='litpic' function='pathinfo(@me)["filename"]'/}</p>

修改 arclist 标签,增加一个自定义字段(高级用法)

如果你需要在列表页中直接调用文章内容里的第一张图片名称,并且希望像 {field:title} 一样方便地使用,可以修改 arclist.lib.php 文件,增加一个自定义的底层字段。

修改 include/taglib/arclist.lib.php 文件

找到 GetArcList 函数,在 $fields 数组中添加一个新的字段,imgname

// 在 $fields 数组中添加
'imgname' => "GetFirstImgName(arc.body)", // arc.body 是文章内容字段

在模板中使用

修改后,你就可以在 arclist 标签中直接使用 [field:imgname/] 了。

{dede:arclist titlelen='30' row='5'}
    <li>
        <!-- 获取第一张图片的文件名 -->
        <p>图片名: [field:imgname/]</p>
    </li>
{/dede:arclist}

注意: 这种方法需要修改核心文件,升级 DedeCMS 时可能会被覆盖,需要重新修改,除非有特殊需求,否则不推荐普通用户使用。


总结与推荐

场景 推荐方法 优点 缺点
获取文章内容里的任意图片名称 extend.func.php + {dede:field.body function} 最灵活、最强大,不修改核心文件,可扩展性强(如获取所有图片名) 需要手动创建/修改 extend.func.php 文件
仅获取缩略图的名称 {field:litpic} + pathinfo 简单、直接,无需额外函数 只能用于缩略图,无法获取文章内容里的图片
在列表页频繁调用文章内图片名 修改 arclist.lib.php 模板调用语法最简洁,像调用普通字段一样方便 修改核心文件,升级有风险,不适合新手

对于绝大多数用户,强烈推荐使用【方法一】,它既安全又灵活,能够满足绝大多数关于图片名称调用的需求。

-- 展开阅读全文 --
头像
warning c语言
« 上一篇 04-20
c语言nullgets
下一篇 » 04-20

相关文章

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

目录[+]