织梦dedecms删除文章的同时删除该文章下的图片和附件以及缩略图的方法
有时候我们删除文章的时候,文章的图片还是会留存在你的图片文件夹上面,这样很占服务器的内存,程序也会变得很大,所以我们需要删除文章的同时把文章里的图片、缩略图也对应的删掉。
但织梦本身是不支持的,需要经过二次开发才可以,互联网上有很多方法,本人测过有些虽然能删除文章内的图片,但是并不能删除缩略图;有些虽然可以达到效果,但修改处太多,影响网站的一些功能失效。
本人是用织梦dedecms5.7的后台开发网站,以下是经过测试可以用的,这种方法最简单,也是最有用,又不影响网站的其它功能。其它版本的后台没有测试过,不确定别的版本能不能用这种方法,使用前最好在本地做下测试。
一、首先在修改前把需要修改的php文件备份好!
二、找到 /include/extend.func.php
复制以下的全部代码直接覆盖到 extend.func.php 文件
1 <?php 2 3 function GetPicsTruePath($body,$litpic) //解析body数据,获得所有图片的绝对地址 4 5 { 6 7 $delfiles = array();//存储图片地址数据 8 9 if(!empty($litpic)) 10 11 { 12 13 $litpicpath = GetTruePath(); 14 15 $litpicpath .= $litpic; 16 17 $delfiles[] = $litpicpath;//缩略图地址 18 19 } 20 21 preg_match_all("/src=[\"|'|\S|\s]([^ |\/|>]*){0,}(([^>]*)\.(gif|jpg|png))/isU",$body,$tmpdata); 22 23 $picspath = array_unique($tmpdata[2]);//body中所有图片的地址 24 25 foreach($picspath as $tmppath) 26 27 { 28 29 $path = GetTruePath();//获得绝对路径 30 31 $picpath = preg_replace("/[a-zA-z]+:\/\/[^ |\/|\s]*/",'',$tmppath);//去掉网址部分 32 33 $path .=$picpath; 34 35 $delfiles[] = $path;//保存处理后的数据 36 37 } 38 39 return $delfiles; 40 41 } 42 43 function WriteToDelFiles($msg)//删除文章的时候会通过此函数记录日志 44 45 { 46 47 if(empty($msg)) $savemsg="未获得消息"; 48 49 else $savemsg = $msg; 50 51 $errorFile = dirname(__FILE__).'/../data/del_body_file.txt';//删除记录文件 52 53 $fp = @fopen($errorFile, 'a'); 54 55 @fwrite($fp,"\r\n{$savemsg}"); 56 57 @fclose($fp); 58 59 } 60 61 //获得文章Body数据 62 63 function GetArcBody($aid) 64 65 { 66 67 global $dsql; 68 69 $query = "SELECT dede_addonarticle.body FROM dede_addonarticle WHERE dede_addonarticle.aid = '$aid'"; 70 71 $row = $dsql->GetOne($query); 72 73 if(is_array($row)) return $row; 74 75 else return false; 76 77 } 78 79 function litimgurls($imgid=0){ 80 81 global $lit_imglist; 82 83 $dsql = new DedeSql(false); 84 85 //获取附加表 86 87 $row = $dsql->GetOne("SELECT c.addtable FROM dede_archives AS a LEFT JOIN dede_channeltype AS c ON a.channel=c.id where a.id='$imgid'"); 88 89 $addtable = trim($row['addtable']); 90 91 //获取图片附加表imgurls字段内容进行处理 92 93 $row = $dsql->GetOne("Select imgurls From `$addtable` where aid='$imgid'"); 94 95 //调用inc_channel_unit.php中ChannelUnit类 96 97 $ChannelUnit = new ChannelUnit(2,$imgid); 98 99 //调用ChannelUnit类中GetlitImgLinks方法处理缩略图 100 101 $lit_imglist = $ChannelUnit->GetlitImgLinks($row['imgurls']); 102 103 //返回结果 104 105 return $lit_imglist; 106 107 } 108 109 ?>
三、找到\dede\inc\inc_batchup.php
复制以下的全部代码直接覆盖 到 inc_batchup.php 文件,\dede\为默认的后台目录,如路径已修改,根据自己网站路径找对应的路径。
1 <?php 2 3 function DelArc($aid,$type='ON',$onlyfile=false) 4 5 { 6 7 global $dsql,$cfg_cookie_encode,$cfg_multi_site,$cfg_medias_dir; 8 9 global $cuserLogin,$cfg_upload_switch,$cfg_delete,$cfg_basedir; 10 11 global $admin_catalogs, $cfg_admin_channel; 12 13 if($cfg_delete == 'N') $type = 'OK'; 14 15 if(empty($aid)) return ; 16 17 $aid = ereg_replace("[^0-9]", '', $aid); 18 19 $arctitle = $arcurl = ''; 20 21 //查询表信息 22 23 $query = "Select ch.maintable,ch.addtable,ch.nid,ch.issystem From `dede_arctiny` arc 24 25 left join `dede_arctype` tp on tp.id=arc.typeid 26 27 left join `dede_channeltype` ch on ch.id=arc.channel where arc.id='$aid' "; 28 29 $row = $dsql->GetOne($query); 30 31 $nid = $row['nid']; 32 33 $maintable = (trim($row['maintable'])=='' ? 'dede_archives' : trim($row['maintable'])); 34 35 $addtable = trim($row['addtable']); 36 37 $issystem = $row['issystem']; 38 39 //查询档案信息 40 41 if($issystem==-1) 42 43 { 44 45 $arcQuery = "Select arc.*,tp.* from `$addtable` arc left join `dede_arctype` tp on arc.typeid=tp.id where arc.aid='$aid' "; 46 47 } 48 49 else 50 51 { 52 53 $arcQuery = "Select arc.*,tp.*,arc.id as aid from `$maintable` arc left join `dede_arctype` tp on arc.typeid=tp.id where arc.id='$aid' "; 54 55 } 56 57 $arcRow = $dsql->GetOne($arcQuery); 58 59 $arcBodyRow = GetArcBody($aid); 60 61 //检测权限 62 63 if(!TestPurview('a_Del,sys_ArcBatch')) 64 65 { 66 67 if(TestPurview('a_AccDel')) 68 69 { 70 71 if( !in_array($arcRow['typeid'], $admin_catalogs) && (count($admin_catalogs) != 0 || $cfg_admin_channel != 'all') ) 72 73 { 74 75 return false; 76 77 } 78 79 } 80 81 else if(TestPurview('a_MyDel')) 82 83 { 84 85 if($arcRow['mid'] != $cuserLogin->getUserID()) 86 87 { 88 89 return false; 90 91 } 92 93 } 94 95 else 96 97 { 98 99 return false; 100 101 } 102 103 } 104 105 //$issystem==-1 是单表模型,不使用回收站 106 107 if($issystem == -1) $type = 'OK'; 108 109 if(!is_array($arcRow)) return false; 110 111 /** 删除到回收站 **/ 112 113 if($cfg_delete == 'Y' && $type == 'ON') 114 115 { 116 117 $dsql->ExecuteNoneQuery("Update `$maintable` set arcrank='-2' where id='$aid' "); 118 119 $dsql->ExecuteNoneQuery("Update `dede_arctiny` set `arcrank` = '-2' where id = '$aid'; "); 120 121 } 122 123 else 124 125 { 126 127 //删除数据库记录 128 129 if(!$onlyfile) 130 131 { 132 133 //删除缩略图 134 135 if($arcRow['litpic']!=""){ 136 137 $dsql->ExecuteNoneQuery("Delete From dede_uploads where url='$arcRow[litpic]'"); 138 139 $truedir = GetTruePath($arcRow['siterefer'],$arcRow['sitepath']); 140 141 $litpicfile = $truedir.$arcRow['litpic']; 142 143 @unlink($litpicfile); 144 145 } 146 147 //删除相关附件 148 149 if($cfg_upload_switch == 'Y') 150 151 { 152 153 $dsql->Execute("me", "SELECT * FROM `dede_uploads` WHERE arcid = '$aid'"); 154 155 while($row = $dsql->GetArray('me')) 156 157 { 158 159 $addfile = $row['url']; 160 161 $aid = $row['aid']; 162 163 $dsql->ExecuteNoneQuery("Delete From `dede_uploads` where aid = '$aid' "); 164 165 $upfile = $cfg_basedir.$addfile; 166 167 if(@file_exists($upfile)) @unlink($upfile); 168 169 } 170 171 } 172 173 $dsql->ExecuteNoneQuery("Delete From `dede_arctiny` where id='$aid'"); 174 175 if($addtable != '') 176 177 { 178 179 $dsql->ExecuteNoneQuery("Delete From `$addtable` where aid='$aid' "); 180 181 } 182 183 if($issystem != -1) 184 185 { 186 187 $dsql->ExecuteNoneQuery("Delete From `dede_archives` where id='$aid' "); 188 189 } 190 191 $dsql->ExecuteNoneQuery("Delete From `dede_feedback` where aid='$aid' "); 192 193 $dsql->ExecuteNoneQuery("Delete From `dede_member_stow` where aid='$aid' "); 194 195 $dsql->ExecuteNoneQuery("Delete From `dede_taglist` where aid='$aid' "); 196 197 $dsql->ExecuteNoneQuery("Delete From `dede_erradd` where aid='$aid' "); 198 199 } 200 201 //删除文本数据 202 203 $filenameh = DEDEDATA."/textdata/".(ceil($aid/5000))."/{$aid}-".substr(md5($cfg_cookie_encode),0,16).".txt"; 204 205 if(@is_file($filenameh)) @unlink($filenameh); 206 207 } 208 209 if(empty($arcRow['money'])) $arcRow['money'] = 0; 210 211 if(empty($arcRow['ismake'])) $arcRow['ismake'] = 1; 212 213 if(empty($arcRow['arcrank'])) $arcRow['arcrank'] = 0; 214 215 if(empty($arcRow['filename'])) $arcRow['filename'] = ''; 216 217 //删除HTML 218 219 if($arcRow['ismake']==-1 || $arcRow['arcrank']!=0 || $arcRow['typeid']==0 || $arcRow['money']>0) 220 221 { 222 223 return true; 224 225 } 226 227 //强制转换非多站点模式,以便统一方式获得实际HTML文件 228 229 $GLOBALS['cfg_multi_site'] = 'N'; 230 231 $arcurl = GetFileUrl($arcRow['aid'],$arcRow['typeid'],$arcRow['senddate'],$arcRow['title'],$arcRow['ismake'], 232 233 $arcRow['arcrank'],$arcRow['namerule'],$arcRow['typedir'],$arcRow['money'],$arcRow['filename']); 234 235 if(!ereg("\?", $arcurl)) 236 237 { 238 239 $htmlfile = GetTruePath().str_replace($GLOBALS['cfg_basehost'],'',$arcurl); 240 241 if(file_exists($htmlfile) && !is_dir($htmlfile)) 242 243 { 244 245 @unlink($htmlfile); 246 247 $arcurls = explode(".", $htmlfile); 248 249 $sname = $arcurls[count($arcurls)-1]; 250 251 $fname = ereg_replace("(\.$sname)$", "", $htmlfile); 252 253 for($i=2; $i<=100; $i++) 254 255 { 256 257 $htmlfile = $fname."_{$i}.".$sname; 258 259 if( @file_exists($htmlfile) ) @unlink($htmlfile); 260 261 else break; 262 263 } 264 265 } 266 267 } 268 269 //解析Body中的资源,并删除 270 271 $willDelFiles = GetPicsTruePath($arcBodyRow['body'],$arcRow['litpic']); 272 273 $nowtime = time(); 274 275 $executetime = MyDate('Y-m-d H:i:s',$nowtime);//获得执行时间 276 277 $msg = "\r\n文章标题:$arcRow[title]"; 278 279 WriteToDelFiles($msg); 280 281 if(!empty($willDelFiles)) 282 283 { 284 285 foreach($willDelFiles as $file) 286 287 { 288 289 if(file_exists($file) && !is_dir($file)) 290 291 { 292 293 if(unlink($file)) $msg = "\r\n位置:$file\r\n结果:删除成功!\r\n时间:$executetime"; 294 295 else $msg = "\r\n位置:$file\r\n结果:删除失败!\r\n时间:$executetime"; 296 297 } 298 299 else $msg = "\r\n位置:$file\r\n结果:文件不存!\r\n时间:$executetime"; 300 301 WriteToDelFiles($msg); 302 303 }//END foreach 304 305 } 306 307 else 308 309 { 310 311 $msg = "\r\n未在Body中解析到数据\r\nBody原始数据:$arcBodyRow[body]\r\n时间:$executetime"; 312 313 WriteToDelFiles($msg); 314 315 } 316 317 return true; 318 319 } 320 321 //获取真实路径 322 323 function GetTruePath($siterefer='', $sitepath='') 324 325 { 326 327 $truepath = $GLOBALS['cfg_basedir']; 328 329 return $truepath; 330 331 } 332 333 ?>
到这里就结束了 , 我们再去试着删除一篇文章 ,你会发现你删除这篇文章以后,这篇文章内容上的图片以及缩略图都同时删除了!
四、删除后,会在/data/目录下,产生日志记录文件:del_body_file.txt。
参考资料:
1、dedecms 删除文章同时删除图片的方法http://www.dede58.com/a/dedejq/11279.html
2、Dede5.7删除文章会删除文章里图片却不删除略图解决方法 http://www.qbxcn.com/bao_news/zhishi/347.html
3、织梦删除文章时候同步删除缩略图和正文图片 https://www.tx83.cn/article-759.html