织梦如何调用文章第一张图片?

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

使用织梦自带的 litpic 字段(最推荐,最规范)

这是织梦官方推荐的最佳实践,它要求你在发布文章时,手动上传一张图片并将其设置为“缩略图”

织梦调用第一张有图片
(图片来源网络,侵删)

优点:

  • 速度快:直接调用数据库字段,效率最高。
  • 可控性强:你可以精确控制哪张图片作为列表图。
  • SEO友好litpic 字段通常用于 alt 属性,利于搜索引擎优化。

缺点:

  • 需要手动为每篇文章设置缩略图。

实现步骤:

  1. 发布文章时设置缩略图: 在织梦后台发布或编辑文章时,在编辑器下方找到“缩略图”选项,点击“上传新图片”或“选择已上传图片”,为你选择的图片设置缩略图。

    织梦调用第一张有图片
    (图片来源网络,侵删)
  2. 在模板文件中调用: 在你的列表页模板(通常是 /templets/default/list_article.htm页模板(article_article.htm)中,使用以下代码调用这张缩略图。

    示例代码(用于列表页):

    <a href="[field:arcurl/]" title="[field:title/]">
        <img src="[field:litpic/]" alt="[field:title/]" />
    </a>
    • [field:litpic/]:直接调用文章设置的缩略图地址。
    • [field:arcurl/]:调用文章的链接地址。
    • [field:title/]:调用文章标题,用作 imgalt 属性,这非常重要。

自动提取文章内容中的第一张图片(最灵活)

如果你不想为每篇文章都手动设置缩略图,可以使用PHP代码自动从文章内容 (body) 中提取第一张图片。

优点:

织梦调用第一张有图片
(图片来源网络,侵删)
  • 自动化:无需手动操作,系统自动获取。
  • 适用性强:适合没有设置缩略图的文章。

缺点:

  • 速度稍慢:需要解析文章内容,对服务器性能有轻微影响。
  • 可能不准确:如果文章内容没有图片,或者第一张图片很小/不合适,效果会打折扣。
  • 代码相对复杂

实现步骤:

在需要调用的地方,使用织梦的 GetFirstImg 自定义函数。

  1. 在模板文件中直接调用: 将以下代码直接放在你需要显示图片的位置。

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

    这段代码会直接输出 <img src="图片地址" alt="" /> 这样的HTML标签。

  2. 更完整的用法(推荐,用于列表页): 通常我们会把它包裹在一个 <a> 标签里,并设置默认图片。

    <a href="[field:arcurl/]" title="[field:title/]">
        [field:body function='(preg_match("/<img\s.*?src\s*=\s*[\'|\"](.*?)[\'|\"].*?>/i", @me, $match) ? $match[1] : "默认图片地址");'/]
    </a>
    • 代码解析
      • preg_match(...):这是一个正则表达式,用于在文章内容 (@me) 中查找第一个 <img> 标签并提取其 src 属性。
      • ? $match[1] : "默认图片地址":这是一个三元运算符,如果找到了图片,就使用 $match[1](即图片地址);如果没有找到,就使用你指定的“默认图片地址”。
      • 你需要将 "默认图片地址" 替换成你自己的图片路径,"/images/default.jpg"

    更简洁的写法(使用 GetFirstImg 函数): 你可以在织梦的 include/common.func.php 文件中添加一个辅助函数,让模板更简洁。

    include/common.func.php 文件末尾添加以下代码:

    /**
     * 获取文章body中的第一张图片路径
     * @param string $body 文章内容
     * @param string $default 默认图片
     * @return string 图片路径
     */
    function GetFirstImg($body, $default = '/images/default.jpg') {
        preg_match_all('/<img.*?src=[\'|\"](.*?)[\'|\"].*?>/i', $body, $str_result, PREG_PATTERN_ORDER);
        $n = count($str_result[1]);
        if($n > 0){
            return $str_result[1][0];
        }else{
            return $default;
        }
    }

    然后在模板中这样调用:

    <a href="[field:arcurl/]" title="[field:title/]">
        <img src="{dede:field.body function='GetFirstImg(@me, "/images/default.jpg")'/}" alt="[field:title/]" />
    </a>

    这种方法更清晰,也方便统一修改默认图片。


使用“描述图片”字段(折中方案)

织梦文章模型中有一个“描述图片”字段,它介于手动和自动之间。

优点:

  • 比手动设置缩略图更灵活。
  • 比自动提取更可控。

缺点:

  • 需要额外操作,不如 litpic 方便。

实现步骤:

  1. 发布文章时设置描述图片: 在发布文章时,找到“描述图片”选项,上传或选择一张图片。

  2. 在模板中调用: 使用 [field:description/] 来调用。

    <a href="[field:arcurl/]" title="[field:title/]">
        <img src="[field:description/]" alt="[field:title/]" />
    </a>

总结与建议

方法 优点 缺点 适用场景
litpic 最快、最规范、最推荐 需手动设置 对图片有明确要求的列表页,如首页、资讯列表。
自动提取 自动化、无需手动 速度慢、可能不准确、代码复杂 对图片要求不高,或作为 litpic 的补充,防止没有缩略图。
description 介于两者之间 不如 litpic 方便 作为 litpic 的备用方案,或者在某些特定场景下使用。

最佳实践建议:

  1. 首选方法一 (litpic):在发布文章时养成设置缩略图的好习惯,这是最专业、最高效的方式。
  2. 结合方法二:可以在调用 litpic 的基础上,增加一个判断:litpic 为空,则再尝试自动提取,这样既有保证,又有灵活性,这个逻辑可以在模板中通过PHP代码实现,也可以在自定义函数中实现。

common.func.php 中写一个更强大的函数:

// 在 common.func.php 中
function GetMyFirstImg($arcid, $default = '/images/default.jpg') {
    // 先尝试获取 litpic
    $row = $GLOBALS['dsql']->GetOne("SELECT litpic FROM `#@__archives` WHERE id = $arcid");
    if (!empty($row['litpic'])) {
        return $row['litpic'];
    }
    // litpic 为空,则从 body 中提取
    $article = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__addonarticle` WHERE aid = $arcid");
    if (!empty($article['body'])) {
        preg_match('/<img.*?src=[\'|"](.*?)[\'|"].*?>/i', $article['body'], $match);
        if (isset($match[1])) {
            return $match[1];
        }
    }
    // 如果都没有,返回默认图
    return $default;
}

然后在模板中调用(需要开启“启用普通模板标签”或使用PHP):

{php $img = GetMyFirstImg($aid, '/images/default.jpg');}
<a href="[field:arcurl/]" title="[field:title/]">
    <img src="<?php echo $img; ?>" alt="[field:title/]" />
</a>

希望这些详细的解释和代码能帮助你解决问题!

-- 展开阅读全文 --
头像
织梦如何获取文章第一张图?
« 上一篇 今天
dede生成栏目为何出现500错误?
下一篇 » 今天
取消
微信二维码
支付宝二维码

目录[+]