织梦列表如何调用文章图片?

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

使用自定义函数(最推荐、最灵活)

这是最专业、最推荐的方法,通过创建一个自定义函数,我们可以在列表标签中像调用普通字段一样(如 [field:title/])来调用文章的第一张图片。

织梦列表调用文章图片
(图片来源网络,侵删)

优点:

  • 代码简洁:在模板里只需要一个简单的标签。
  • 性能高:函数在PHP层面处理,效率比模板标签高。
  • 灵活性高:可以轻松修改函数以实现更多功能,比如获取指定大小的图片、判断有无图片等。

操作步骤:

第一步:创建自定义函数文件

  1. 打开你的织梦网站根目录。
  2. 找到并打开 /include/extend.func.php 文件,如果这个文件不存在,请自己创建一个。
  3. 在这个文件的末尾(?> 之前),添加以下PHP代码:
/**
 * 获取文章第一张图片路径
 * @param string $body 文章内容
 * @return string 图片路径,如果没有则返回默认图片
 */
function GetFirstImg($body) {
    // 如果内容为空,返回空或默认图
    if (empty($body)) {
        return '';
    }
    // 匹配img标签的正则表达式
    $preg = "/<img\s.*?src\s*=\s*[\"|']?(.*?)[\"|']?\s.*?>/i";
    preg_match_all($preg, $body, $match);
    // 如果找到了图片
    if (isset($match[1][0])) {
        // 返回第一张图片的src
        return $match[1][0];
    } else {
        // 如果没有找到图片,可以返回一个默认图片地址
        // 请将 '/images/default.jpg' 替换为你自己的默认图片路径
        return '/images/default.jpg'; 
    }
}

代码解释:

织梦列表调用文章图片
(图片来源网络,侵删)
  • 这个函数接收一个参数 $body,也就是文章的内容。
  • 使用正则表达式 preg_match_all 在文章内容中查找所有 <img>
  • isset($match[1][0]) 判断是否找到了至少一张图片。
  • 如果找到了,就返回第一张图片的 src 属性值。
  • 如果没找到,可以返回一个空字符串 ,或者返回一个你预设的默认图片路径(如 /images/default.jpg)。强烈建议使用默认图片,以避免列表页显示空白。

第二步:在列表页模板中使用

  1. 打开你的列表页模板文件,通常是 /templets/default/list_*.htm ( 代表栏目ID)。
  2. 在你需要显示图片的地方,使用以下标签:
<img src="{GetFirstImg([field:body/])}" alt="[field:title/]" />

说明:

  • {GetFirstImg([field:body/])} 这个标签的意思是:调用我们刚刚创建的 GetFirstImg 函数,并把当前文章的 [field:body/])作为参数传递进去。
  • alt="[field:title/]" 是为了让图片的替代文本等于文章标题,这有利于SEO。

第三步:更新缓存

保存模板文件后,登录织梦后台,点击 “生成” -> “更新HTML”,选择你的列表页进行更新,这样修改才能生效。

织梦列表调用文章图片
(图片来源网络,侵删)

使用织梦自带的 array 标签(稍显复杂)

如果你不想修改PHP文件,也可以在模板文件里使用织梦的 array 循环和 preg_match 来实现。

优点:

  • 无需修改PHP文件,纯模板操作。

缺点:

  • 模板代码冗长,可读性差。
  • 性能略低于方法一。

操作步骤:

在列表页模板中,将原来的列表循环标签 {dede:list}{dede:arclist} 替换为以下代码:

{dede:arclist row='10' titlelen='50'}
    <li>
        <!-- 使用preg_match匹配第一张图 -->
        [field:array runphp='yes']
            preg_match_all('/<img.*?src="(.*?)".*?>/i', @me, $match);
            if(isset($match[1][0])){
                @me = $match[1][0];
            }else{
                @me = '/images/default.jpg'; // 默认图片
            }
        [/field:array]
        <!-- 输出图片 -->
        <img src="[field:array runphp='yes']preg_match_all('/<img.*?src="(.*?)".*?>/i', @me, $match); if(isset($match[1][0])){ @me = $match[1][0]; }else{ @me = '/images/default.jpg'; }[/field:array]" alt="[field:title/]" />
        <!-- 输出标题 -->
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

代码解释:

  • [field:array runphp='yes']...[/field:array] 是一个特殊的字段,允许在模板内执行PHP代码。
  • preg_match_all(...) 的逻辑和方法一的自定义函数完全一样。
  • @me 在这里代表 [field:body/] 的原始值。
  • if(isset($match[1][0])){ @me = ... } 将匹配到的图片路径或默认路径赋值给 @me,这个值最终会成为 <img> 标签的 src

修改数据库字段(不推荐,仅作了解)

理论上,你可以修改 dede_archives 表,增加一个 litpicfirstimg 字段,然后在发布文章时,通过程序将第一张图片的地址存入这个字段,然后在列表标签中直接调用 [field:firstimg/]

为什么不推荐?

  • 极其繁琐:需要修改数据库、修改发布文章的程序、修改编辑器逻辑,涉及面广。
  • 维护困难:升级织梦版本时,你的修改很可能会被覆盖,导致功能失效。
  • 没有必要:方法一和方法二已经完美解决了这个问题,且更简单、更灵活。

总结与建议

方法 优点 缺点 推荐度
自定义函数 代码简洁、性能高、灵活 需要修改PHP文件 ★★★★★ (强烈推荐)
array 无需修改PHP文件 模板代码冗长、性能略低 ★★★☆☆ (备选方案)
修改数据库 调用最直接 极其繁琐、维护困难 ☆☆☆☆☆ (不推荐)

对于绝大多数用户来说,强烈推荐使用方法一,它是一次性的简单配置,后续在所有模板中都能轻松复用,是最佳实践。

-- 展开阅读全文 --
头像
dede会员空间模板如何自定义修改?
« 上一篇 今天
c 语言 http get
下一篇 » 今天

相关文章

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