织梦文章自定义图片如何设置?

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

后台手动添加(最常用、最直接)

这是最基础也是最灵活的方法,通过修改文章模型,增加一个专门的“自定义缩略图”字段。

织梦 文章自定义图片
(图片来源网络,侵删)

操作步骤:

  1. 进入后台 -> 附加设置 -> 内容模型管理

    找到你正在使用的文章模型(通常是“文章”),点击后面的“字段管理”。

  2. 添加新字段

    • 点击“添加新字段”按钮。
    • 字段名称: litpic (这是织梦默认缩略图字段名,如果只是想增加一个不影响原流程的,可以起个新名,如 custom_thumb)
    • 字段类型: 多媒体 (这个类型可以直接调用上传器,非常方便)
    • 字段提示: 自定义缩略图 (在后台发布文章时,这里会显示提示文字)
    • 是否显示在发布页: (务必选择是,否则后台发布文章时看不到这个输入框)
    • 其他选项:保持默认即可。
  3. 保存并更新缓存

    织梦 文章自定义图片
    (图片来源网络,侵删)
    • 点击“保存”按钮。
    • 系统会提示你“更改模型字段,请更新缓存以确保正常使用!”,点击“确定”或手动去“系统 -> 数据库备份/还原”里执行“一键更新网站缓存”。
  4. 发布文章时使用

    • 现在去发布一篇新文章,你会发现文章编辑页多了一个“自定义缩略图”的选项。
    • 点击上传按钮,选择你想要的图片即可。
  5. 在前端模板中调用

    • 如果你用的是新的字段名 custom_thumb,在模板中调用方式如下:
      {dede:field.custom_thumb /}
    • 如果你直接用了默认的 litpic 字段,那么它就会覆盖掉系统自动提取的缩略图,调用方式和原来一样:
      <img src="{dede:field.litpic /}" alt="{dede:field.title /}" />

优点

  • 完全可控,可以精确指定任何图片作为缩略图。
  • 不需要修改核心文件,升级时无忧。

缺点

织梦 文章自定义图片
(图片来源网络,侵删)
  • 每篇文章都需要手动上传,对于批量导入的文章来说比较麻烦。

修改 arc.archives.class.php 文件(自动提取,但优先级更高)

这个方法的核心是修改织梦的底层解析类,让它在获取缩略图时,优先检查文章内容中是否有你指定的特定格式(比如一个带有特定class的img标签),如果有,就使用这张图,否则再走原来的逻辑。

操作步骤:

  1. 找到并修改文件

    • 文件路径:/include/arc.archives.class.php
    • 用代码编辑器(如 VS Code, Sublime Text, Notepad++)打开这个文件。
  2. 定位关键函数

    • 搜索函数 GetLitPic(),这个函数就是用来获取文章缩略图的。
    • 在这个函数里,找到处理文章内容正则匹配的代码段,通常在函数的末尾。
  3. 修改代码逻辑

    • 原来的代码大概是这样(简化版):

      // ... 其他代码 ...
      if($row['litpic'] != '' && !preg_match("#^http://#", $row['litpic']) && $GLOBALS['cfg_multi_site'] != 'N')
      {
        $row['litpic'] = $GLOBALS['cfg_basehost'].$row['litpic'];
      }
      return $row['litpic'];
    • 我们需要在这段代码之前加入我们的自定义逻辑。

    • 修改后的代码示例(在 return $row['litpic']; 之前添加):

      // 在 return $row['litpic']; 之前添加以下代码

    // 【自定义逻辑开始】 // 如果文章内容不为空,并且还没有设置litpic(或者你想覆盖已有litpic) if (empty($row['litpic']) || $your_priority_rule) { $body = $row['body']; // 获取文章内容 // 使用正则表达式查找带有特定 class 的图片,class="custom-thumb" // preg_match_all('/<img\s+[^>]?class\s=\s[\'"](.?custom-thumb.?)[\'"][^>]?src\s=\s\'"[\'"][^>]*?>/i', $body, $matches);

      // 更简单的,只查找第一个 img 标签的 src
      preg_match_all('/<img\s+[^>]*?src\s*=\s*[\'"]([^\'"]*?)[\'"][^>]*?>/i', $body, $matches);
      if (isset($matches[1]) && !empty($matches[1])) {
          // 取第一张图片
          $first_img = $matches[1][0];
          // 如果是相对路径,转为绝对路径
          if ($first_img && !preg_match("#^http://#", $first_img) && $GLOBALS['cfg_multi_site'] != 'N') {
              $first_img = $GLOBALS['cfg_basehost'] . $first_img;
          }
          $row['litpic'] = $first_img; // 将找到的图片地址赋值给 litpic
      }

    } // 【自定义逻辑结束】

    // 原来的代码 if($row['litpic'] != '' && !preg_match("#^http://#", $row['litpic']) && $GLOBALS['cfg_multi_site'] != 'N') { $row['litpic'] = $GLOBALS['cfg_basehost'].$row['litpic']; } return $row['litpic'];

    
    *   **代码解释**:
        *   这段代码会首先检查文章内容 `body`。
        *   使用正则表达式 `<img\s+[^>]*?src\s*=\s*[\'"]([^\'"]*?)[\'"][^>]*?>` 来匹配文章中的所有 `<img>` 标签,并提取其 `src` 属性。
        *   如果找到了图片,就把第一张图片的地址赋值给 `$row['litpic']`。
        *   系统会返回这个新的 `$row['litpic']`。
  4. 保存文件并测试

    • 保存修改后的 arc.archives.class.php 文件。
    • 访问一篇有图片但没有后台缩略图的文章,看看首页或列表页是否正确显示了内容中的第一张图。

优点

  • 完全自动化,无需手动操作。
  • 不需要修改文章模型,对现有文章无影响。

缺点

  • 需要修改核心文件,织梦升级时可能会被覆盖,需要重新修改。
  • 灵活性较低,只能按照固定的规则(如取第一张图)来执行。

结合方法一和方法二(最佳实践)

这是最推荐的方法,结合了手动控制的灵活性和自动提取的便利性。

逻辑顺序

  1. 优先使用后台自定义的缩略图(即 litpic 字段有值)。
  2. 如果后台没有,则自动从文章内容中提取第一张图片
  3. 如果都没有,则显示一个默认的“无图”占位图

如何实现:

你只需要使用方法二中修改 arc.archives.class.php 的代码,但需要微调一下逻辑。

修改后的 GetLitPic() 函数逻辑

// 在 arc.archives.class.php 的 GetLitPic() 函数中,修改如下:
// ... 函数开始部分 ...
// 【自定义逻辑开始】
// 1. 优先检查 litpic 字段是否已有值(即后台是否设置了自定义图片)
if (empty($row['litpic'])) {
    // 2. litpic 为空,则尝试从文章内容中提取
    $body = $row['body'];
    // 匹配所有图片
    preg_match_all('/<img\s+[^>]*?src\s*=\s*[\'"]([^\'"]*?)[\'"][^>]*?>/i', $body, $matches);
    if (isset($matches[1]) && !empty($matches[1])) {
        // 取第一张图片
        $first_img = $matches[1][0];
        // 处理相对路径
        if ($first_img && !preg_match("#^http://#", $first_img) && $GLOBALS['cfg_multi_site'] != 'N') {
            $first_img = $GLOBALS['cfg_basehost'] . $first_img;
        }
        $row['litpic'] = $first_img; // 赋值
    } else {
        // 3. 如果内容中也没有图片,则设置一个默认的“无图”图片
        $row['litpic'] = '/images/default.jpg'; // 请确保这个默认图片路径存在
    }
}
// 【自定义逻辑结束】
// 原来的代码,处理绝对路径
if($row['litpic'] != '' && !preg_match("#^http://#", $row['litpic']) && $GLOBALS['cfg_multi_site'] != 'N')
{
    $row['litpic'] = $GLOBALS['cfg_basehost'].$row['litpic'];
}
return $row['litpic'];
// ... 函数结束部分 ...

前端模板调用(带默认图): 为了确保万无一失,在模板中也最好加上默认图。

<img src="{dede:field.litpic runphp='yes'}
    if(@me == '') @me = '/images/default.jpg';
    else @me = @me;
{/dede:field.litpic}" alt="{dede:field.title /}" />

或者更简单的方式(PHP逻辑在后台处理了,前端直接调用):

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

总结与建议

方法 优点 缺点 适用场景
后台添加字段 灵活可控,不修改核心文件 需手动上传每篇文章图片 对图片有特殊要求、内容质量高的网站
修改核心文件 完全自动化,无需手动 修改核心文件,升级易丢失 图片要求统一,文章数量庞大的站点
最佳实践 兼具灵活与自动,体验好 需修改核心文件 绝大多数网站的首选

对于大多数网站,我强烈推荐方法三,它为站长提供了最终的控制权(后台可随时覆盖),同时又为没有手动设置的文章提供了良好的自动回退机制,大大提升了网站的自动化程度和用户体验。

-- 展开阅读全文 --
头像
织梦挑错插件整合模板
« 上一篇 前天
织梦安装后图片不显示,怎么办?
下一篇 » 前天

相关文章

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

目录[+]