dedecms 删除文章同时删除文章里本地图片的方法

本代码没改dede原有代码,只是加了删除方法到里面。使用时请先备份 

即使不成功,这里也至少给大家提供了一种思路和方法。
在dede5.6gbk版测试成功!utf8大家自己测试 !覆盖前备份好文件

/include/extend.func.php

\]*){0,}((\[^>\]*)\\.(gif|jpg|png))/isU",$body,$tmpdata); $picspath = array_unique($tmpdata\[2\]);//body中所有图片的地址 foreach($picspath as $tmppath) { $path = GetTruePath();//获得绝对路径 $picpath = preg_replace("/\[a-zA-z\]+:\\/\\/\[^ |\\/|\\s\]*/",'',$tmppath);//去掉网址部分 $path .=$picpath; $delfiles\[\] = $path;//保存处理后的数据 } return $delfiles; } function WriteToDelFiles($msg)//删除文章的时候会通过此函数记录日志 { if(empty($msg)) $savemsg="未获得消息"; else $savemsg = $msg; $errorFile = dirname(__FILE__).'/../data/del_body_file.txt';//删除记录文件 $fp = @fopen($errorFile, 'a'); @fwrite($fp,"\\r\\n{$savemsg}"); @fclose($fp); } //获得文章Body数据 function GetArcBody($aid) { global $dsql; $query = "SELECT dede_addonarticle.body FROM dede_addonarticle WHERE dede_addonarticle.aid = '$aid'"; $row = $dsql->GetOne($query); if(is_array($row)) return $row; else return false; } function litimgurls($imgid=0){ global $lit_imglist; $dsql = new DedeSql(false); //获取附加表 $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'"); $addtable = trim($row\['addtable'\]); //获取图片附加表imgurls字段内容进行处理 $row = $dsql->GetOne("Select imgurls From \`$addtable\` where aid='$imgid'"); //调用inc_channel_unit.php中ChannelUnit类 $ChannelUnit = new ChannelUnit(2,$imgid); //调用ChannelUnit类中GetlitImgLinks方法处理缩略图 $lit_imglist = $ChannelUnit->GetlitImgLinks($row\['imgurls'\]); //返回结果 return $lit_imglist; } ?>

 

  \dede\inc\inc_batchup.php

GetOne($query); $nid = $row\['nid'\]; $maintable = (trim($row\['maintable'\])=='' ? 'dede_archives' : trim($row\['maintable'\])); $addtable = trim($row\['addtable'\]); $issystem = $row\['issystem'\]; //查询档案信息 if($issystem==-1) { $arcQuery = "Select arc.*,tp.* from \`$addtable\` arc left join \`dede_arctype\` tp on arc.typeid=tp.id where arc.aid='$aid' "; } else { $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' "; } $arcRow = $dsql->GetOne($arcQuery); $arcBodyRow = GetArcBody($aid); //检测权限 if(!TestPurview('a_Del,sys_ArcBatch')) { if(TestPurview('a_AccDel')) { if( !in_array($arcRow\['typeid'\], $admin_catalogs) && (count($admin_catalogs) != 0 || $cfg_admin_channel != 'all') ) { return false; } } else if(TestPurview('a_MyDel')) { if($arcRow\['mid'\] != $cuserLogin->getUserID()) { return false; } } else { return false; } } //$issystem==-1 是单表模型,不使用回收站 if($issystem == -1) $type = 'OK'; if(!is_array($arcRow)) return false; /** 删除到回收站 **/ if($cfg_delete == 'Y' && $type == 'ON') { $dsql->ExecuteNoneQuery("Update \`$maintable\` set arcrank='-2' where id='$aid' "); $dsql->ExecuteNoneQuery("Update \`dede_arctiny\` set \`arcrank\` = '-2' where id = '$aid'; "); } else { //删除数据库记录 if(!$onlyfile) { //删除相关附件 if($cfg_upload_switch == 'Y') { $dsql->Execute("me", "SELECT * FROM \`dede_uploads\` WHERE arcid = '$aid'"); while($row = $dsql->GetArray('me')) { $addfile = $row\['url'\]; $aid = $row\['aid'\]; $dsql->ExecuteNoneQuery("Delete From \`dede_uploads\` where aid = '$aid' "); $upfile = $cfg_basedir.$addfile; if(@file_exists($upfile)) @unlink($upfile); } } $dsql->ExecuteNoneQuery("Delete From \`dede_arctiny\` where id='$aid'"); if($addtable != '') { $dsql->ExecuteNoneQuery("Delete From \`$addtable\` where aid='$aid' "); } if($issystem != -1) { $dsql->ExecuteNoneQuery("Delete From \`dede_archives\` where id='$aid' "); } $dsql->ExecuteNoneQuery("Delete From \`dede_feedback\` where aid='$aid' "); $dsql->ExecuteNoneQuery("Delete From \`dede_member_stow\` where aid='$aid' "); $dsql->ExecuteNoneQuery("Delete From \`dede_taglist\` where aid='$aid' "); $dsql->ExecuteNoneQuery("Delete From \`dede_erradd\` where aid='$aid' "); } //删除文本数据 $filenameh = DEDEDATA."/textdata/".(ceil($aid/5000))."/{$aid}-".substr(md5($cfg_cookie_encode),0,16).".txt"; if(@is_file($filenameh)) @unlink($filenameh); } if(empty($arcRow\['money'\])) $arcRow\['money'\] = 0; if(empty($arcRow\['ismake'\])) $arcRow\['ismake'\] = 1; if(empty($arcRow\['arcrank'\])) $arcRow\['arcrank'\] = 0; if(empty($arcRow\['filename'\])) $arcRow\['filename'\] = ''; //删除HTML if($arcRow\['ismake'\]==-1 || $arcRow\['arcrank'\]!=0 || $arcRow\['typeid'\]==0 || $arcRow\['money'\]>0) { return true; } //强制转换非多站点模式,以便统一方式获得实际HTML文件 $GLOBALS\['cfg_multi_site'\] = 'N'; $arcurl = GetFileUrl($arcRow\['aid'\],$arcRow\['typeid'\],$arcRow\['senddate'\],$arcRow\['title'\],$arcRow\['ismake'\], $arcRow\['arcrank'\],$arcRow\['namerule'\],$arcRow\['typedir'\],$arcRow\['money'\],$arcRow\['filename'\]); if(!ereg("\\?", $arcurl)) { $htmlfile = GetTruePath().str_replace($GLOBALS\['cfg_basehost'\],'',$arcurl); if(file_exists($htmlfile) && !is_dir($htmlfile)) { @unlink($htmlfile); $arcurls = explode(".", $htmlfile); $sname = $arcurls\[count($arcurls)-1\]; $fname = ereg_replace("(\\.$sname)$", "", $htmlfile); for($i=2; $i<=100; $i++) { $htmlfile = $fname."_{$i}.".$sname; if( @file_exists($htmlfile) ) @unlink($htmlfile); else break; } } } //解析Body中的资源,并删除 $willDelFiles = GetPicsTruePath($arcBodyRow\['body'\],$arcRow\['litpic'\]); $nowtime = time(); $executetime = MyDate('Y-m-d H:i:s',$nowtime);//获得执行时间 $msg = "\\r\\n文章标题:$arcRow\[title\]"; WriteToDelFiles($msg); if(!empty($willDelFiles)) { foreach($willDelFiles as $file) { if(file_exists($file) && !is_dir($file)) { if(unlink($file)) $msg = "\\r\\n位置:$file\\r\\n结果:删除成功!\\r\\n时间:$executetime"; else $msg = "\\r\\n位置:$file\\r\\n结果:删除失败!\\r\\n时间:$executetime"; } else $msg = "\\r\\n位置:$file\\r\\n结果:文件不存!\\r\\n时间:$executetime"; WriteToDelFiles($msg); }//END foreach } else { $msg = "\\r\\n未在Body中解析到数据\\r\\nBody原始数据:$arcBodyRow\[body\]\\r\\n时间:$executetime"; WriteToDelFiles($msg); } return true; } //获取真实路径 function GetTruePath($siterefer='', $sitepath='') { $truepath = $GLOBALS\['cfg_basedir'\]; return $truepath; } ?>

这种方法是解析文章的内容,实用性强,其实这种方法不仅仅适用于dede,只要灵活处理,很多地方都可以用。其实也可根据dede的数据库来删除图片,将与文章相关的图片删掉,但是这样的坏处是需要查询数据库,且必须知道数据库的具体结构。