织梦详情页调用缩略图

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 织梦建站 正文

核心概念:织梦的缩略图存储

要理解织梦如何处理缩略图,缩略图信息主要存储在两个地方:

织梦详情页调用缩略图
(图片来源网络,侵删)
  1. 主表 (#@__archives): litpic 字段,这个字段存储的是缩略图的完整路径/uploads/240318/1-24031Q12345.jpg,如果文章没有上传缩略图,这个字段通常为空 。
  2. 附加表 (#@__addonarticle): piclist 字段,这个字段通常用于存储多图,格式是一个逗号分隔的图片路径字符串,/uploads/240318/1-24031Q12345.jpg,/uploads/240318/2-24031Q12346.jpg

调用缩略图,本质上就是从这些字段中提取路径,并拼接成完整的 <img>


使用系统自带标签(最推荐、最简单)

织梦系统内置了 {dede:field} 标签来直接调用文章的字段,对于缩略图,推荐使用 function='GetImage...' 来处理,这样可以自动处理路径和为空的情况。

调用单张缩略图(最常用)

这是最标准、最安全的方法,它会自动判断 litpic 字段是否为空,如果为空则不显示任何图片。

代码示例:

{dede:field name='litpic' function='GetImage(@me, 1)'/}

代码解析:

织梦详情页调用缩略图
(图片来源网络,侵删)
  • {dede:field name='litpic'}: 调用文章主表中的 litpic 字段,获取图片路径。
  • function='GetImage(@me, 1)': 这是一个非常重要的函数。
    • @me: 代表 litpic 字段的当前值(即图片路径)。
    • GetImage(): 这是织梦系统内置的函数,用于处理图片路径。
    • 1: 是一个可选参数,表示是否启用“自动缩放”功能,通常我们不需要缩放,所以这个参数可以省略或设为0,但保留它通常无害。

完整展示的 img

上面的标签会直接输出一个完整的 <img> 标签,

<img src='/uploads/240318/1-24031Q12345.jpg' alt='文章标题' width='...' height='...' style='width:; height:; border:0px;' />

进阶用法:自定义图片样式

如果你需要给图片添加自定义的CSS类、控制大小等,可以使用 style 属性。

织梦详情页调用缩略图
(图片来源网络,侵删)
<!-- 给图片添加一个 'thumb-img' 的CSS类,并设置最大宽度为200px -->
{dede:field name='litpic' function='GetImage(@me, 1)'}
    <img src='{dede:field name='litpic'/}' alt='{dede:field.title/}' class='thumb-img' style='max-width: 200px;' />
{/dede:field}

注意:这种写法需要判断 litpic 是否为空,否则会显示一个空的 <img> 标签,方法一更简洁。

调用多图中的第一张图(备用方案)

你可能没有上传单张缩略图,而是在内容里上传了多图,并希望用多图的第一张作为缩略图展示。

代码示例:

{dede:field name='array' runphp='yes'}
    $dtp = new DedeTagParse();
    $dtp->LoadSource(@me);
    $litpic = $dtp->GetTag('litpic');
    $imgurls = $dtp->GetTag('imgurls');
    // 如果litpic不为空,优先使用litpic
    if(!empty($litpic)) {
        @me = $litpic;
    } 
    // 如果litpic为空,则从imgurls中提取第一张
    else if(!empty($imgurls)) {
        preg_match_all("/<img([^>]*)\s*src=['\"]([^'\"]*)['\"][^>]*>/i", $imgurls, $matches);
        if(isset($matches[2][0])) {
            @me = $matches[2][0];
        } else {
            @me = '';
        }
    } else {
        @me = '';
    }
    @me = GetImage(@me);
{/dede:field}

代码解析:

这段PHP代码逻辑是:

  1. 获取文章的所有字段,存入 $array
  2. 分别提取 litpic(单图)和 imgurls(多图)字段。
  3. 优先判断litpic 有值,就使用它。
  4. 其次判断litpic 为空但 imgurls 有值,就用正则表达式从 imgurls 字符串中解析出第一张 <img> 标签的 src 路径。
  5. GetImage() 函数处理得到的路径。
  6. @me = ... 将最终结果赋值给标签的输出。

这种方法非常灵活,能适应多种情况。


使用自定义函数(高级、灵活)

如果你想在多个模板中复用这个逻辑,或者需要更复杂的处理,可以创建一个自定义函数。

创建自定义函数文件

  1. 打开织梦的 include/extend.func.php 文件(如果不存在,请自行创建)。
  2. 在文件末尾添加如下PHP函数代码:
/**
 * 获取文章缩略图
 * 优先使用litpic,如果为空则从imgurls中获取第一张
 * @param string $imgurls 文章的多图字段值
 * @param string $litpic 文章的缩略图字段值
 * @return string 返回处理后的图片标签或空字符串
 */
function GetArticleFirstImg($imgurls = '', $litpic = '') {
    // 如果litpic不为空,优先使用litpic
    if (!empty($litpic)) {
        return GetImage($litpic);
    }
    // 如果litpic为空,则从imgurls中提取第一张
    if (!empty($imgurls)) {
        preg_match_all("/<img([^>]*)\s*src=['\"]([^'\"]*)['\"][^>]*>/i", $imgurls, $matches);
        if (isset($matches[2][0])) {
            return GetImage($matches[2][0]);
        }
    }
    // 如果都为空,可以返回一个默认图片或者空字符串
    // return '<img src="/images/default.jpg" alt="暂无图片" />';
    return '';
}

在模板中调用自定义函数

你可以在任何详情页模板中非常简洁地调用这个函数。

代码示例:

{dede:field name='litpic' function='GetArticleFirstImg(@me, @me)'/}

代码解析:

  • function='GetArticleFirstImg(@me, @me)':
    • 我们调用了刚刚创建的 GetArticleFirstImg 函数。
    • 第一个 @me 传递的是 litpic 的值,作为函数的 $litpic 参数。
    • 第二个 @me 同样传递的是 litpic 的值,作为函数的 $imgurls 参数,虽然这里有点冗余,但为了函数接口的统一性,可以这样写,更精确的写法是分别获取两个字段,但这样调用最简单。

更精确的调用方式:

{dede:field name='imgurls' function='GetArticleFirstImg(@me, dede:field name='litpic'/)'/}

注意:在 function 参数里嵌套调用其他标签有时会不稳定,所以第一种传递两个 @me 的方法更常用。


常见问题与解决方案 (FAQ)

为什么我的缩略图不显示,或者显示不出来?

  • 文章本身没有上传缩略图。
    • 解决:检查后台编辑文章时,是否在“高级选项”->“缩略图”中上传了图片,或者检查数据库 #@__archives 表中该文章的 litpic 字段是否为空。
  • 图片路径错误,图片不存在。
    • 解决:检查 uploads 目录下是否存在你调用路径的图片,可能是上传失败或图片被移动/删除了。
  • 标签写错。
    • 解决:仔细检查标签名称,litpic 不要写成 lithpicpic
  • 模板缓存问题。
    • 解决:登录织梦后台 -> 系统 -> 一键更新缓存,然后更新一下你的页面。

如何给缩略图添加CSS样式或控制尺寸?

直接在 {dede:field} 标签外面包裹一个 <img> 标签,并添加你的属性。

<!-- 推荐方法:使用 function 输出完整标签,然后通过CSS控制 -->
{dede:field name='litpic' function='GetImage(@me, 1)'/}
<!-- 或者,如果你想完全控制HTML结构 -->
{dede:field name='litpic' function='str_replace("<img ", "<img class='my-class' style='max-width:100%;height:auto;' ", @me)'/}

上面的第二种方法,通过 str_replace 函数直接替换输出的 <img> 标签的字符串,添加自定义的 classstyle

我想调用文章内容里的第一张图怎么办?

这和方法二的“备用方案”类似,可以直接使用那段PHP代码,或者把它封装成一个更专门的函数。

直接在模板中使用(不推荐用于复杂逻辑,但可用):

{dede:field.body runphp='yes'}
    $body = @me;
    preg_match_all("/<img([^>]*)\s*src=['\"]([^'\"]*)['\"][^>]*>/i", $body, $matches);
    if(isset($matches[2][0])) {
        @me = GetImage($matches[2][0]);
    } else {
        @me = ''; // 或者输出一个默认图片
    }
{/dede:field}

方法 优点 缺点 适用场景
系统标签 简单、高效、官方推荐、自动处理空值 灵活性相对较低 绝大多数情况下的首选,特别是只需要调用 litpic 时。
自定义函数 灵活、可复用、逻辑清晰、功能强大 需要修改PHP文件,对新手有一定门槛 需要在多个地方调用相同逻辑,或者需要更复杂的判断(如优先级、默认图等)。

对于绝大多数用户,直接使用方法一中的 {dede:field name='litpic' function='GetImage(@me, 1)'/} 是最简单、最可靠的选择,如果遇到特殊需求,再考虑使用方法二的自定义函数。

-- 展开阅读全文 --
头像
中英文企业网站织梦猫
« 上一篇 今天
谭浩强C语言第三版,适合零基础自学吗?
下一篇 » 今天

相关文章

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