知识问答
如何在织梦dedecms中删除文章时一并删除附件?
2025-09-21 14:40:48
来源:互联网转载
在织梦dedecms中,删除文章时同时删除附件可以通过修改系统设置或编写自定义代码实现。具体步骤如下:,,1. 进入织梦dedecms后台管理界面。,2. 找到并点击“系统”选项。,3. 在系统设置中找到“附件设置”选项。,4. 在附件设置中,勾选“删除文档时删除关联附件”。,5. 保存设置。,,完成以上步骤后,当你删除文章时,系统将自动删除与该文章关联的附件。
在织梦CMS(DedeCMS)中,删除文章时默认不会同时删除附件,这可能会导致服务器空间被无用的附件占用,为了解决这个问题,可以通过修改系统核心文件来实现删除文章的同时删除相关附件的功能,以下是详细的解决步骤:
添加两个函数
1、根据文档ID获取文档的body部分:
function getArcBody($arcid) { global $dsql; if(empty($arcid)) return ; $body = ''; $query = "select arc.*,ch.addtable,ch.fieldset fromdede_arctiny
as arc left joindede_channeltype
as ch on arc.channel=ch.id where arc.id=$arcid"; $row = $dsql>GetOne($query); if(empty($row)) return ; $addtable = $row['addtable']; $fieldset = $row['fieldset']; include_once(DEDEINC.'./dedetag.class.php'); $dtp = new DedeTagParse(); $dtp>SetNameSpace('field','<','>'); $dtp>LoadSource($fieldset); if(is_array($dtp>CTags)) { foreach($dtp>CTags as $tid=>$tag) { if($tag>GetAtt('type')=='htmltext') { $body = $tag>GetName(); break; } } } if(!empty($body)) { $query = "select $body from$addtable
where aid=$arcid"; $row = $dsql>GetOne($query); $body = $row[$body]; return $body; } return ;}
2、解析文档内容的本地图片:
function get_img_from_body($body) { $result = array(); if(empty($body)) return $result; preg_match_all('/\ssrc=([\"|\'])([^\1]*?)\.(gif|jpg|jpeg|png)\1/',$body,$res); if(!empty($res[2])) { foreach($res[2] as $k=>$v) { $result[] = $v.'.'.$res[3][$k]; } } return $result;}
修改DedeCMS系统核心文件
1、打开 /include/extend.func.php 文件,在最后加入以下代码:
function GetPicsTruePath($body,$litpic) { $delfiles = array();//存储图片地址数据 if(!empty($litpic)) { $litpicpath = GetTruePath(); $litpicpath .= $litpic; $delfiles[] = $litpicpath;//缩略图地址 } preg_match_all("/src=[\"|'|\S|\s]([^ |\/|>]*){0,}(([^>]*)\.(gif|jpg|png))/isU",$body,$tmpdata); $picspath = array_unique($tmpdata[2]);//body中所有图片的地址 foreach($picspath as $tmppath) { $path = GetTruePath();//获得绝对路径 $picpath = preg_replace("/[azAz]+:\/\/[^ |\/|\s]*/",'',$tmppath);//去掉网址部分 $path .=$picpath; $delfiles[] = $path;//保存处理后的数据 } return $delfiles;}
2、打开 /dede/inc/inc_batchup.php 文件,找到第22行并在下面添加如下代码:
$body = getArcBody($aid);
继续找到第139行,在return true;
上面一行添加如下代码:
if($body) { $img_arr = get_img_from_body($body); if(!empty($img_arr)) { foreach($img_arr as $v) { $img_file = GetTruePath().str_replace($GLOBALS['cfg_basehost'],'',$v); if(file_exists($img_file) && !is_dir($img_file)) { @unlink($img_file); } } }}
通过以上步骤,可以实现在删除文章时自动删除相应的附件,节省服务器空间,提高管理效率,如果有任何问题或需要进一步的帮助,可以参考以下FAQs:
FAQs:
1、Q: 为什么在删除文章时还需要删除附件?
A: 在删除文章时保留附件会占用不必要的服务器空间,特别是当网站内容频繁更新时,这些无用的附件会逐渐积累,影响网站的迁移和维护效率,删除文章时同步删除附件可以有效节省空间和管理成本。
2、Q: 上述方法是否适用于所有版本的DedeCMS?
A: 上述方法主要针对DedeCMS的核心文件进行修改,因此在大多数版本中应该适用,不同版本的DedeCMS可能会有细微的差异,建议在操作前备份相关文件,并在测试环境中验证后再应用到生产环境。