织梦如何调用文章所有图片?

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

推荐使用 - 自定义函数 + 自定义标签(最灵活、最推荐)

这是最规范、最灵活的方法,可以在任何需要的地方调用,并且代码复用性高。

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

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

这个文件是织梦用来存放自定义函数的,修改它不会影响核心文件,非常安全。

  1. 用FTP或文件管理器打开您的网站根目录。
  2. 找到并打开 /include/extend.func.php 文件。
  3. 在文件末尾的 ?> 之前,添加以下PHP代码:
/**
 * 获取文章内容中的所有图片
 * @param string $body 文章内容
 * @param int $num 获取图片的数量,0为获取所有
 * @return string 返回图片数组,如 array('imgsrc1', 'imgsrc2', ...)
 */
function GetImages($body, $num = 0) {
    // 清除所有样式和脚本标签,防止干扰
    $body = preg_replace('/<style[^>]*>.*?<\/style>/is', '', $body);
    $body = preg_replace('/<script[^>]*>.*?<\/script>/is', '', $body);
    // 匹配所有img标签
    preg_match_all('/<img\s[^>]*src=(["\'])([^"\']+)\1[^>]*>/i', $body, $matches);
    $img_srcs = $matches[2]; // 获取所有图片地址
    // 如果指定了数量,则截取数组
    if ($num > 0 && count($img_srcs) > $num) {
        $img_srcs = array_slice($img_srcs, 0, $num);
    }
    return $img_srcs;
}

代码解释:

  • 这个函数接收两个参数:$body)和 $num(要获取的图片数量,0表示全部)。
  • 使用正则表达式 preg_match_all 来查找文章内容中所有 <img> 标签的 src 属性值。
  • 返回一个包含所有图片地址的数组。

第2步:在模板文件中使用自定义标签

您可以在任何文章列表页(如 arclist.htm)或文章内容页(如 article_article.htm)中调用这个函数了。

示例1:在文章列表页(arclist.htm)中调用

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

假设您想在文章列表的摘要后面显示该文章的第一张图片。

{dede:arclist row='10' titlelen='50'}
    <div class="article-item">
        <h3><a href="[field:arcurl/]">[field:title/]</a></h3>
        <p class="summary">[field:description function='cn_substr(@me,100)'/]...</p>
        <!-- 调用函数,获取第一张图片 -->
        [field:id function=GetImages(@me, 1)]
        <!-- 因为函数返回的是数组,我们需要取出第一个元素 -->
        {dede:getdata name='imgsrcs'}
            {if $imgsrcs[0]}
                <div class="article-img">
                    <img src="[field:imgsrcs[0]/]" alt="[field:title/]" />
                </div>
            {/if}
        {/dede:getdata}
        <a href="[field:arcurl/]" class="read-more">阅读全文</a>
    </div>
{/dede:arclist}

上面的写法稍显复杂,更简洁的写法是使用 runphp(但 runphp 在新版织梦中可能被禁用或有安全风险,如果可用,这是最简洁的):

{dede:arclist row='10' titlelen='50'}
    <div class="article-item">
        <h3><a href="[field:arcurl/]">[field:title/]</a></h3>
        <p class="summary">[field:description function='cn_substr(@me,100)'/]...</p>
        <!-- 使用runphp直接执行PHP代码 -->
        [field:id runphp='yes']
            $aid = @me;
            $row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__addonarticle` WHERE aid = $aid");
            // 如果是普通文章,表是 #@__archives,字段是 body
            // 如果是普通文章,应该用:
            // $row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__archives` WHERE id = $aid");
            // 这里假设是普通文章模型
            $body = $row['body'];
            $img_srcs = GetImages($body, 1);
            @me = $img_srcs[0] ? "<div class='article-img'><img src='".$img_srcs[0]."' alt='".htmlspecialchars($row['title'])."' /></div>" : "";
        [/field:id]
        <a href="[field:arcurl/]" class="read-more">阅读全文</a>
    </div>
{/dede:arclist}

注意runphp 方法需要明确文章内容存储在哪个表(#@__archives 还是 #@__addonarticle),并且对服务器安全配置有要求。

示例2:在文章内容页(article_article.htm)中调用 页,文章内容已经由 [field:body/] 标签解析好了,我们可以直接在页面其他位置调用。

假设想在文章内容下方,展示一个该文章所有图片的缩略图列表。

<!DOCTYPE html>
<html>
<head>[field:title/]</title>
</head>
<body>
    <h1>[field:title/]</h1>
    <div class="content">
        [field:body/]
    </div>
    <!-- 在这里调用函数,获取所有图片 -->
    {dede:getdata name='all_images'}
        [field:id function=GetImages(@me, 0)]
        {if $all_images}
            <div class="gallery">
                <h3>文章图片</h3>
                <ul>
                    {dede:list}
                        <li>
                            <a href="[field:global.cfg_cmsurl/]/[field:src/]" data-lightbox="gallery">
                                <img src="[field:src/]" alt="[field:global.autoindex/]" />
                            </a>
                        </li>
                    {/dede:list}
                </ul>
            </div>
        {/if}
    {/dede:getdata}
</body>
</html>

上面的写法在织梦标签嵌套上可能会出错,更稳妥的方式是使用 runphp

<!DOCTYPE html>
<html>
<head>[field:title/]</title>
</head>
<body>
    <h1>[field:title/]</h1>
    <div class="content">
        [field:body/]
    </div>
    <!-- 使用runphp获取文章ID并调用函数 -->
    [field:id runphp='yes']
        $aid = @me;
        // 从主表获取文章内容
        $row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__archives` WHERE id = $aid");
        $body = $row['body'];
        // 调用我们之前写的函数
        $all_images = GetImages($body, 0); // 获取所有图片
        // 如果有图片,则生成HTML
        if ($all_images) {
            $html = '<div class="gallery"><h3>文章图片</h3><ul>';
            foreach ($all_images as $img_src) {
                // 为了安全,给图片路径加上网站根目录
                $full_img_src = $GLOBALS['cfg_basehost'] . $img_src;
                $html .= "<li><a href='{$full_img_src}' data-lightbox='gallery'><img src='{$full_img_src}' alt='' /></a></li>";
            }
            $html .= '</ul></div>';
            @me = $html;
        } else {
            @me = ''; // 如果没有图片,则不显示任何内容
        }
    [/field:id]
</body>
</html>

使用正则表达式直接在模板中提取(不推荐,仅作了解)

这种方法不修改任何文件,直接在模板里写PHP代码,简单粗暴,但可读性和维护性差,且依赖 runphp 功能。

{dede:arclist row='5'}
    <div>
        <h2>[field:title/]</h2>
        [field:id runphp='yes']
            $aid = @me;
            $row = $GLOBALS['dsql']->GetOne("SELECT body FROM `#@__archives` WHERE id = $aid");
            $body = $row['body'];
            // 一行搞定,直接匹配并输出第一张图
            preg_match('/<img\s+.*?src=["|\']?(.+?)["|\']?\s+.*?>/i', $body, $img);
            @me = $img[1] ? "<img src='".$img[1]."' width='200' />" : "";
        [/field:id]
    </div>
{/dede:arclist}

缺点:

  • 代码臃肿,难以阅读。
  • 如果需要修改逻辑(比如获取3张图),就得修改这段复杂的代码。
  • 和方法一中的 runphp 示例一样,存在安全风险和依赖性问题。

修改织梦源码(非常不推荐,仅适用于高级用户)

这种方法通过修改织梦的核心文件,为 arclistlist 标签增加一个新功能,imgsrcimgnum,这能实现像 [field:title/] 一样直接调用。

警告: 修改核心文件在织梦升级时会被覆盖,导致功能失效,且容易引发未知错误,强烈不推荐普通用户使用

如果非要实现,大致步骤如下:

  1. 修改 /include/taglib/arclist.lib.php 文件。
  2. 在SQL查询中增加对 body 字段的获取(SELECT body, ...)。
  3. 在循环处理数据的部分,增加对 body 内容的解析,提取图片地址。
  4. 将提取到的图片地址存入一个数组,并传递给模板。
  5. 在模板中就可以使用 [field:imgsrc/] 这样的新标签了。

由于此方法过于复杂且风险高,这里不提供具体代码。


总结与建议

方法 优点 缺点 推荐度
自定义函数 灵活、规范、可复用、安全 需要修改 extend.func.php 文件,并理解 runphp 或嵌套标签 ★★★★★ (最推荐)
模板正则 无需修改文件,快速实现 代码可读性差,难以维护,依赖 runphp ★★☆☆☆ (不推荐)
修改源码 功能集成度高,调用最方便 破坏核心文件,升级后失效,风险极高 ☆☆☆☆☆ (强烈不推荐)

对于绝大多数用户,请使用【方法一:自定义函数】,它虽然需要你稍微动手修改一下 extend.func.php,但这是最专业、最稳定、最易于扩展的解决方案,一旦函数写好,你就可以在网站的任何地方轻松调用。

-- 展开阅读全文 --
头像
织梦自带地图怎么用?快速上手指南!
« 上一篇 今天
阿里云oss dede
下一篇 » 今天

相关文章

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

目录[+]