dede如何调取文章缩略图?方法是什么?

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

核心概念

在织梦系统中,文章的缩略图信息主要存储在两个地方:

dede调取文章缩略图
(图片来源网络,侵删)
  1. litpic 字段:这是文章附加表(如 dede_addonarticle)里的一个字段,专门用来存储上传的缩略图路径,如果你在后台发布文章时,通过“上传图片”或“远程图片”功能选择了缩略图,那么路径就会保存在这里。
  2. body 字段:这是文章正文内容,如果文章正文中包含了 <img> 标签,我们也可以从正文中提取第一张图片作为缩略图。

根据你的需求,可以选择不同的方法。


直接调用 litpic 字段(最推荐)

这是最标准、最可靠的方法,适用于你已经为每篇文章上传或指定了缩略图的情况。

在列表页(如 arclist 标签)中调用

arclist 是织梦用于调用文章列表的万能标签,它可以直接获取 litpic 的值。

基本语法:

dede调取文章缩略图
(图片来源网络,侵删)
{dede:arclist row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">
            <img src="[field:litpic/]" alt="[field:title function='html2text(@me)'/]" />
        </a>
        <a href="[field:arcurl/]">[field:title function='html2text(@me)'/]</a>
    </li>
{/dede:arclist}

代码解释:

  • {dede:arclist row='10' ...}: 调用10篇文章。
  • [field:litpic/]: 核心,直接输出该文章的缩略图路径。
  • [field:arcurl/]: 输出文章的链接地址。
  • [field:title function='html2text(@me)'/]: 输出文章标题,并使用 function='html2text' 过滤掉HTML标签,确保 alt 属性的纯净。

页(如 article_articledit.htm)中调用

在文章详情页,通常使用 field 标签来调用当前文章的字段。

基本语法:

<img src="{dede:field name='litpic'/}" alt="{dede:field name='title'/}" />

代码解释:

dede调取文章缩略图
(图片来源网络,侵删)
  • {dede:field name='litpic'/}: 直接获取当前文章的 litpic 字段值。

从文章正文 (body) 提取第一张图作为缩略图

如果你没有为每篇文章单独上传缩略图,但希望文章正文的第一张图片能作为列表页的缩略图,可以使用这个方法,这种方法非常灵活,但需要用到自定义函数。

步骤1:在 /include/extend.func.php 文件中添加自定义函数

这是织梦扩展功能的核心文件,打开它,在 ?> 标签前添加以下PHP函数:

/**
 * 从文章正文中提取第一张图片
 * @param string $body 文章内容
 * @return string 图片路径,如果没有则返回默认图
 */
function GetFirstImg($body)
{
    $preg = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
    preg_match_all($preg, $body, $match);
    if (isset($match[1][0])) {
        return $match[1][0];
    } else {
        // 如果没有图片,可以返回一个默认的缩略图地址
        // 请将 /images/default.jpg 替换为你自己的默认图片路径
        return '/images/default.jpg'; 
    }
}

函数说明:

  • 这个函数使用正则表达式在文章内容 ($body) 中查找第一个 <img> 标签,并提取其 src 属性的值。
  • 如果找到了图片,就返回图片路径。
  • 如果没有找到图片,则返回一个你指定的默认缩略图,避免列表页显示空白。

步骤2:在模板中使用 function 调用这个新函数

你可以在模板中调用这个函数了。

在列表页(arclist 标签)中使用:

{dede:arclist row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">
            <!-- 调用我们刚刚创建的 GetFirstImg 函数,参数是文章正文 [field:body/] -->
            <img src="[field:body function='GetFirstImg(@me)'/]" alt="[field:title function='html2text(@me)'/]" />
        </a>
        <a href="[field:arcurl/]">[field:title function='html2text(@me)'/]</a>
    </li>
{/dede:arclist}

页中使用:**

<img src="{dede:field name='body' function='GetFirstImg(@me)'/}" alt="{dede:field name='title'/}" />

结合 litpicbody 的“兜底”方案(最稳健)

这是一种生产环境中非常推荐的方案,逻辑如下:

  1. 优先检查 litpic 字段,如果有值,就使用 litpic
  2. litpic 为空,则再从文章正文中提取第一张图片。
  3. 如果正文中也没有图片,则显示默认图片。

这需要你使用一个更复杂的自定义函数。

步骤1:修改 /include/extend.func.php 中的函数

将之前的 GetFirstImg 函数替换为下面这个更强大的版本:

/**
 * 智能获取文章缩略图
 * 优先级:litpic > 正文第一张图 > 默认图
 * @param string $litpic 专用缩略图
 * @param string $body    文章内容
 * @return string 最终的缩略图路径
 */
function GetSmartThumb($litpic, $body)
{
    // 1. litpic 不为空,直接返回
    if (!empty($litpic)) {
        return $litpic;
    }
    // 2. litpic 为空,尝试从正文中提取
    $preg = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
    preg_match_all($preg, $body, $match);
    if (isset($match[1][0])) {
        return $match[1][0];
    }
    // 3. 如果都没有,返回默认图
    return '/images/default.jpg'; // 请替换为你的默认图片路径
}

步骤2:在模板中调用新函数

在列表页(arclist 标签)中使用:

{dede:arclist row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">
            <!-- 同时传入 litpic 和 body 两个参数 -->
            <img src="[field:litpic function='GetSmartThumb(@me, @me)'/]" alt="[field:title function='html2text(@me)'/]" />
        </a>
        <a href="[field:arcurl/]">[field:title function='html2text(@me)'/]</a>
    </li>
{/dede:arclist}

注意:这里有一个小技巧。arclist 标签在循环时,每次都会把当前记录的所有字段(包括 litpicbody)作为 @me 传递给函数。function='GetSmartThumb(@me, @me)' 实际上是将 litpicbody 的值分别传给了函数的前两个参数。 页中使用:**

<img src="{dede:field name='litpic' function='GetSmartThumb(@me, @me)'/}" alt="{dede:field name='title'/}" />

注意页,{dede:field name='litpic'}@melitpic 的值,而 {dede:field name='body'}@mebody 的值,它们不在同一个作用域,这种写法在内容页是错误的。 页的正确调用方式:** 页的 field 标签无法同时传递两个字段,我们需要在模板中稍微处理一下,或者使用PHP代码块,更简单的方式是创建一个专门用于内容页的函数,但为了通用性,我们推荐在模板里直接使用PHP逻辑(如果你的模板支持)。

<?php
// 如果模板支持PHP代码,可以这样写
if(!empty($fields['litpic'])) {
    $thumb = $fields['litpic'];
} else {
    $preg = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
    preg_match_all($preg, $fields['body'], $match);
    $thumb = isset($match[1][0]) ? $match[1][0] : '/images/default.jpg';
}
?>
<img src="<?php echo $thumb; ?>" alt="<?php echo $fields['title']; ?>" />

总结与建议

方法 优点 缺点 适用场景
litpic 简单、快速、性能最好 依赖后台手动上传缩略图 对缩略图有专门要求,且内容编辑规范的网站。
body 提取 灵活、自动化,无需手动上传 性能稍差(需解析HTML),可能提取到无关小图 内容以图文为主,且不希望额外管理缩略图的网站。
智能混合 最稳健、最可靠,体验最好 函数和模板调用稍复杂 生产环境首选,兼顾了效率和自动化,确保列表页永远有图。

最终建议:

对于绝大多数网站,强烈推荐使用方法三(智能混合方案),它完美地结合了前两种方法的优点,提供了最好的用户体验和系统健壮性,虽然初期设置函数需要多花几分钟,但一劳永逸,避免了后续的各种麻烦。

-- 展开阅读全文 --
头像
vs2010 C语言编程如何快速入门?
« 上一篇 03-05
织梦的安装目录是哪个
下一篇 » 03-05
取消
微信二维码
支付宝二维码

目录[+]