⭐ 方法一:使用DedeCMS自带功能(最推荐、最安全)
DedeCMS从V5.3版本开始,就在后台加入了一个非常实用的“附件管理”功能,可以完美解决这个问题。

(图片来源网络,侵删)
操作步骤:
-
登录DedeCMS后台:使用您的管理员账号登录网站后台。
-
进入“附件管理”:
- 在左侧菜单栏中,找到并点击 “附件管理” -> “文件管理器”。
-
设置删除规则:
(图片来源网络,侵删)- 在文件管理器页面,您会看到顶部有一个“删除”按钮。
- 关键一步:在点击“删除”按钮之前,请确保页面右上角的 “只显示未使用附件” 这个选项是 勾选状态。
- 为什么重要:勾选此项后,列表中只会显示那些没有被任何文章引用的“孤儿图片”,这样,您在删除时就不会误删其他文章正在使用的图片,非常安全。
-
执行删除:
- 勾选“只显示未使用附件”后,页面会自动刷新,列出所有未被引用的图片。
- 您可以全选这些图片(点击列表上方的“全选”复选框),然后点击 “删除” 按钮。
- 系统会弹出确认框,再次确认即可。
优点:
- 安全:通过“只显示未使用附件”的筛选,绝不会误删正在使用的图片。
- 彻底:可以一次性清理掉所有历史积累的“孤儿图片”。
- 官方功能:稳定可靠,无需修改核心文件。
缺点:
- 被动:这是一种“事后补救”的方法,需要您定期手动执行,而不是在删除文章时自动触发。
修改 dede/inc/inc_archives_functions.php 文件(自动触发)
如果您希望在每次删除文章时,都自动删除该文章内的所有图片,可以修改DedeCMS的核心函数文件。此方法为自动触发,但有一定风险,请务必谨慎操作并提前备份!

(图片来源网络,侵删)
操作步骤:
-
备份文件:
- 在修改之前,请务必备份您的网站文件,特别是
dede/inc/inc_archives_functions.php这个文件,这是防止操作失误导致网站崩溃的黄金法则。
- 在修改之前,请务必备份您的网站文件,特别是
-
找到并打开文件:
- 通过FTP或文件管理器,找到并下载
/dede/inc/inc_archives_functions.php文件。
- 通过FTP或文件管理器,找到并下载
-
定位关键函数:
- 在文件中搜索
function DelArc($aid)函数,这个函数就是处理文章删除的核心逻辑。
- 在文件中搜索
-
添加删除图片的代码:
- 在
function DelArc($aid)函数中,找到执行删除文章数据库记录的那一行代码,通常类似DeleteArchives($aid);。 - 在这行代码的后面,添加以下PHP代码来提取并删除文章内容中的所有图片。
// --- 在 DelArc 函数中添加以下代码 --- // 在执行 DeleteArchives($aid); 之后添加 // 获取文章内容 $arcRow = GetOneArchive($aid); $body = $arcRow['body']; // 匹配出所有图片的 src 属性值 $pattern = '/<img\s+[^>]*?src\s*=\s*["\']?(?P<src>[^>"\']*)["\']?[^>]*?>/i'; preg_match_all($pattern, $body, $matches); if (isset($matches['src']) && !empty($matches['src'])) { require_once(DEDEINC.'/image.func.php'); // 引入图片处理函数 $dellink = array(); foreach ($matches['src'] as $imgUrl) { // 如果是本地图片 if (strpos($imgUrl, '://') === false || strpos($imgUrl, $_SERVER['HTTP_HOST']) !== false) { // 将相对路径转换为绝对路径 $imgPath = preg_replace('/[\/\\\\]{1,}/', '/', dirname(__FILE__) . '/../../' . $imgUrl); $imgPath = str_replace('//', '/', $imgPath); // 删除图片文件 if (file_exists($imgPath)) { @unlink($imgPath); } } } } // --- 代码结束 --- - 在
-
保存文件并上传:
- 将修改后的
inc_archives_functions.php文件上传回服务器,覆盖原文件。
- 将修改后的
优点:
- 自动化:删除文章时,图片会随之自动删除,无需手动干预。
- 高效:一步到位,适合对自动化要求高的用户。
缺点:
- 有风险:修改核心文件是危险操作,如果代码有误或逻辑不周,可能会导致网站功能异常。
- 误删风险:如果文章内容中的图片路径是外部链接或特殊格式,这段代码可能无法处理,或者错误地删除了其他文件(虽然上面的代码已经做了一些路径判断来降低风险)。
- 升级困难:未来如果升级DedeCMS,这个修改会被覆盖,需要重新修改。
使用SQL命令(批量清理,适合一次性操作)
如果您想一次性清理掉所有文章中已经被删除但图片还留在服务器上的“孤儿图片”,可以执行SQL查询。
警告:此方法威力巨大,请务必在执行前 备份数据库
操作步骤:
-
登录phpMyAdmin:进入您的网站数据库管理工具(通常是phpMyAdmin)。
-
选择数据库:选择您的DedeCMS数据库名。
-
执行SQL查询:
- 点击“SQL”选项卡,在输入框中粘贴以下SQL语句,然后点击“执行”。
-- 这条SQL语句的目的是找到所有被删除的文章ID,然后根据这些ID找出它们引用的图片并删除 -- 此操作非常危险,请在测试环境充分验证后再在生产环境执行! -- 步骤1: 创建一个临时表,存储所有已删除文章的图片路径 CREATE TEMPORARY TABLE temp_orphan_images ( img_path VARCHAR(255) ); -- 步骤2: 将所有已删除文章的图片路径插入到临时表 -- 假设文章内容表为 `#@__addonarticle` 或 `#@__archives`,请根据您的实际情况调整表名 -- 这里以 `#@__archives` 表为例(默认文章表) INSERT INTO temp_orphan_images (img_path) SELECT t2.img_path FROM (SELECT aid FROM `#@__archives` WHERE arcrank = -2) AS t1 JOIN (SELECT aid, SUBSTRING_INDEX(SUBSTRING_INDEX(body, 'src="', -1), '"', 1) AS img_path FROM `#@__archives` WHERE body LIKE '%<img%') AS t2 ON t1.aid = t2.aid; -- 步骤3: 根据临时表中的路径,删除服务器上的图片文件 (这一步非常危险,请务必先确认路径正确!) -- PHP代码部分无法直接在SQL中执行,所以这里需要您手动或通过脚本完成。 -- 上面方法二的PHP代码更适合这个任务,SQL更适合找出这些图片,然后您再手动或用脚本删除。 -- 更安全的做法是:只查询出这些图片的路径,然后您手动核对并删除。 -- 以下查询会列出所有“已删除文章”的图片路径,供您核对: SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(body, 'src="', -1), '"', 1) AS orphan_image_url FROM `#@__archives` WHERE arcrank = -2 AND body LIKE '%<img%';
关于SQL方法的说明:
- 直接通过SQL删除文件是极其困难的,而且非常危险,SQL更擅长查询数据。
- 上面提供的SQL查询可以帮助您找出所有被删除文章所引用的图片URL。
- 您可以将查询结果导出,然后结合方法二的PHP逻辑,编写一个安全的脚本去删除这些文件。
- 对于大多数用户来说,方法一(后台附件管理)仍然是批量清理最安全、最简单的方式。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 后台附件管理 | 安全、简单、官方支持 | 需要手动定期操作 | 所有用户,特别是新手和不希望修改核心文件的用户,这是首选和最推荐的方法。 |
| 修改核心文件 | 自动化、一步到位 | 有风险、修改核心文件、升级困难 | 对自动化有高要求,且熟悉代码、愿意承担风险的高级用户。 |
| SQL查询 | 可以精准定位“孤儿图片” | 操作复杂、风险极高、不适合直接删除文件 | 需要一次性大规模清理,并且有技术能力编写安全脚本的专家用户。 |
最终建议:
- 对于日常维护,请优先使用方法一,定期登录后台清理“未使用附件”。
- 如果您确定需要实现“删除文章即删图”的自动化流程,请严格按照方法二的步骤操作,并务必提前备份文件。
