在使用 Dedecms 管理内容时,删除文档的同时自动清理文章中的图片是一项非常实用的功能。本文将详细介绍如何实现这一功能,帮助您优化网站资源管理流程。
首先,在 Dedecms 的“/include”目录下创建一个名为“extend.func.php”的文件。接着,将以下代码保存到该文件中,其中包括三个关键函数。
// 解析 body 数据,获取所有图片的绝对地址
function GetPicsTruePath($body, $litpic) {
$delfiles = array(); // 存储图片地址数据
if (!empty($litpic)) {
$litpicpath = GetTruePath();
$litpicpath .= $litpic;
$delfiles[] = $litpicpath; // 缩略图地址
}
preg_match_all("/src=[\\"|'|\\S|\\s]([^ title="liehuo.net" |\\/|>]*){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;
}
// 获取文章 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 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);
}
接下来,打开“/dede/inc/inc_batchup.php”文件,并按照以下步骤进行修改:
1. 在第 33 行下方(即“$arcRow = $dsql->GetOne($arcQuery);”之后)添加以下代码:
$arcBodyRow = GetArcBody($aid);
2. 在第 138 行下方(即“return true;”之前)添加以下代码:
// 解析 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);
}
} else {
$msg = "\\r\\n未在 Body 中解析到数据\\r\\nBody 原始数据:$arcBodyRow[body]\\r\\n时间:$executetime";
WriteToDelFiles($msg);
}
完成以上修改后,当您删除文章时,程序会自动分析文章 Body 中的图片地址并将其删除。同时,系统会在“/data/”目录下生成日志文件“del_body_file.txt”,记录删除操作的具体信息。
通过上述方法,您可以有效减少服务器上的冗余文件,提高资源利用率,同时为 SEO 提供更清晰的站点结构。