删除文章同时也可以删除附件

[复制链接]
树苗收集系 发表于 2020-9-16 16:19:09 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
我们在做网站发布文章的时候,难免需要一些图片等等让文章更丰富,但是在删除的时候却发现只能删除文章内容,里面曾经上传的图片和附件确实还保留在服务器中,占用着我们有限的空间。

今天织梦模板网就分享一个很实用的功能,删除织梦文章的同时删掉该文章下的图片与附件等文件,有效的节省了后期慢慢排除无用图片和附件的时间还实时节省了一些不必要的存储空间。

实现方法如下:

1.打开/include/extend.func.php文件,在最后加入如下代码

  1. //解析body数据,获得所有图片的绝对地址

  2. function GetPicsTruePath($body,$litpic)

  3. {

  4.         $delfiles = array();

  5.         //存储图片地址数据

  6.         if(!empty($litpic))

  7.           {

  8.                 $litpicpath = GetTruePath();

  9.                 $litpicpath .= $litpic;

  10.                 $delfiles[] = $litpicpath;

  11.                 //缩略图地址

  12.         }

  13.         preg_match_all("/src=["|'|\S|\s]([^ |\/|>]*){0,}(([^>]*)\.(gif|jpg|png))/isU",$body,$tmpdata);

  14.   $picspath = array_unique($tmpdata[2]);//body中所有图片的地址

  15.   foreach($picspath as $tmppath)

  16.   {

  17.     $path = GetTruePath();//获得绝对路径

  18.     $picpath = preg_replace("/[a-zA-z]+:\/\/[^ |\/|\s]*/",'',$tmppath);//去掉网址部分

  19.     $path .=$picpath;

  20.     $delfiles[] = $path;//保存处理后的数据

  21.   }

  22.   return $delfiles;

  23. }

  24. //获得文章Body数据  

  25. function GetArcBody($aid)  

  26. {  

  27. global $dsql;  

  28. $query = "SELECT js_addonarticle.body FROM xmzy_addonarticle WHERE xmzy_addonarticle.aid = '$aid'";  

  29. $row = $dsql->GetOne($query);  

  30. if(is_array($row))  

  31. return $row;  

  32. else

  33. return false;  

  34. }

  35. //修改于2010.01.28

  36. //写入日志文件  

  37. function WriteToDelFiles($msg)//删除文章的时候会通过此函数记录日志  

  38. {  

  39. if(empty($msg)) $savemsg="未获得消息";  

  40. else $savemsg = $msg;  

  41. $errorFile = dirname(__FILE__).'/../data/del_body_file.txt';//删除记录文件  

  42. $fp = @fopen($errorFile, 'a');  

  43. @fwrite($fp," {$savemsg}");  

  44. @fclose($fp);  

  45. }
复制代码

2.打开dede/inc/inc_batchup.php文件,找到:

  1. $arcRow = $dsql->GetOne($arcQuery);
复制代码

在下边添加:

  1. $arcBodyRow = GetArcBody($aid);
复制代码

最后找到:

  1. return TRUE;
复制代码

在这句话上边添加:

  1. //解析Body中的资源,并删除  

  2. $willDelFiles = GetPicsTruePath($arcBodyRow['body'],$arcRow['litpic']);

  3. $nowtime = time();

  4. $executetime = MyDate('Y-m-d H:i:s',$nowtime);

  5. //获得执行时间  

  6. $msg = " 文章标题:$arcRow[title]";

  7. WriteToDelFiles($msg);

  8. if(!empty($willDelFiles))  

  9. {

  10.         foreach($willDelFiles as $file)  

  11.         {

  12.                 if(file_exists($file) && !is_dir($file))  

  13.                 {

  14.                         if(unlink($file)) $msg = " 位置:$file 结果:删除成功! 时间:$executetime"; else $msg = " 位置:$file 结果:删除失败! 时间:$executetime";

  15.                 }

  16.                 else $msg = " 位置:$file 结果:文件不存! 时间:$executetime";

  17.                 WriteToDelFiles($msg);

  18.         }

  19.         //END foreach

  20. } else

  21. {

  22.         $msg = " 未在Body中解析到数据 Body原始数据:$arcBodyRow[body] 时间:$executetime";

  23.         WriteToDelFiles($msg);

  24. }
复制代码

然后保存,这样处理后就实现了删除文章连带当前文章的图片和附件一同删除。

下面是其他网友的补充

首先添加两个函数

  1. /*

  2. 根据文档id获取文档的body部分

  3. */

  4. function getArcBody($arcid)

  5. {

  6. global $dsql;

  7. if(empty($arcid)) return ;

  8. $body = '';

  9. $query = "select arc.*,ch.addtable,ch.fieldset from `dede_arctiny` as arc left join `dede_channeltype` as ch on arc.channel=ch.id where arc.id=$arcid";

  10. $row = $dsql->GetOne($query);

  11. if(empty($row)) return ;

  12. $addtable = $row['addtable'];

  13. $fieldset = $row['fieldset'];

  14. include_once(DEDEINC.'./dedetag.class.php');

  15. $dtp = new DedeTagParse();

  16. $dtp->SetNameSpace('field','<','>');

  17. $dtp->LoadSource($fieldset);

  18. if(is_array($dtp->CTags))

  19. {

  20. foreach($dtp->CTags as $tid=>$tag)

  21. {

  22. if($tag->GetAtt('type')=='htmltext')

  23. {

  24. $body = $tag->GetName();

  25. break;

  26. }

  27. }

  28. }

  29. if(!empty($body))

  30. {

  31. $query = "select $body from `$addtable` where aid=$arcid";

  32. $row = $dsql->GetOne($query);

  33. $body = $row[$body];

  34. return $body;

  35. }

  36. return ;

  37. }

  38. /*

  39. 解析文档内容的本地图片图片

  40. */

  41. function get_img_from_body($body)

  42. {

  43. $result = array();

  44. if(empty($body))

  45. return $result;

  46. preg_match_all('/\ssrc=(["|\'])([^\1]*?)\.(gif|jpg|jpeg|png)\1/',$body,$res);

  47. if(!empty($res[2]))

  48. {

  49. foreach($res[2] as $k=>$v)

  50. {

  51. $result[] = $v.'.'.$res[3][$k];

  52. }

  53. }

  54. return $result;

  55. }
复制代码

把这段代码贴到include/common.func.php后面,
接着打开后台(假设使用默认的dede作为后台)dede/inc/inc_batchup.php文件,
在第22行添加代码如下:
  1. $body = getArcBody($aid);
复制代码
接在在第139行,就是在
  1. return true;
复制代码
上面一行加上下面的代码

  1. if($body)

  2. {

  3. $img_arr = get_img_from_body($body);

  4. if(!empty($img_arr))

  5. {

  6. foreach($img_arr as $v)

  7. {

  8. $img_file = GetTruePath().str_replace($GLOBALS['cfg_basehost'],'',$v);

  9. if(file_exists($img_file) && !is_dir($img_file))

  10. @unlink($img_file);

  11. }

  12. }

  13. }

复制代码

这样就可以实现删除文档的时候删除字段为“htmltext”类型的中的本地图片了。

回复

使用道具 举报

精彩评论2

淡看红尘轻笑孤 发表于 2020-9-24 10:12:27 | 显示全部楼层
很给力。。。。很喜欢
回复

使用道具 举报

柠檬树上的少女 发表于 2020-12-18 13:32:30 | 显示全部楼层
必须支持。。。。。。。
回复

使用道具 举报

发布主题
推荐阅读 更多
阅读排行 更多
广告位
全国统一客服电话
400-1234-5678

24x7小时免费咨询

  • 官方在线客服

    QQ客服:小西

    点击交谈

    QQ客服:良子

    点击交谈

    QQ客服:闵月

    点击交谈
  • 安徽省合肥市高新区创新产业园

  • 手机扫码查看手机版

    手机查找资源更方便

  • 扫一扫关注官方微信

    加入官方微信群