一种是通过后台SQL命令直接操作数据库(推荐),另一种是修改核心文件增加一个新按钮(适合有一定开发基础的用户)。

使用后台SQL命令(推荐,最安全)
这种方法的核心思想是:先找到所有采集内容对应的文章ID(arcid),然后根据这些ID批量删除文章和相关数据。
操作步骤:
-
登录DedeCMS后台
使用你的管理员账号登录网站后台。
(图片来源网络,侵删) -
进入SQL命令行工具
- 在后台左侧菜单栏,找到 “系统” -> “SQL命令行工具”。
- 点击进入,你会看到一个文本框,用于输入SQL语句。
-
准备并执行SQL命令
场景1:删除指定采集任务的所有内容
假设你的采集任务的ID是
10(你可以在“采集”->“采集管理”中看到每个任务的ID)。
(图片来源网络,侵删)-
第一步:获取该任务下所有文章的ID 在SQL命令行工具中,输入以下查询语句,先看看会删除多少条数据,确认无误后再执行删除。
SELECT arcid FROM dede_archives WHERE typeid IN (SELECT id FROM dede_arctype WHERE corank > -1 AND issystem <> -1);
注意: 这句SQL可能不够精确,更精确的方法是如果你的采集任务有特定标记,比如在自定义字段里,但最常见的是,采集任务生成的文章通常会有一个特征,比如来源(source)或者关键词(keywords)包含特定词,或者它们属于某个特定的栏目(这个栏目是专门用来放采集内容的)。
更推荐的精确查找方法(按栏目ID): 假设你所有采集的内容都放在ID为
50的栏目下。SELECT id FROM dede_archives WHERE typeid = 50;
-
第二步:批量删除文章及相关数据 如果你确认了要删除的栏目ID是
50,那么现在执行删除命令,DedeCMS的文章数据是分表存储的,所以需要删除多个表中的数据。-- 1. 删除主表文章 DELETE FROM dede_archives WHERE typeid = 50; -- 2. 删除附加表内容(如果文章有模型,比如文章、图集等,需要删除对应表的数据) -- 假设使用的是默认的文章模型,附加表是 dede_addonarticle DELETE FROM dede_addonarticle WHERE aid IN (SELECT id FROM dede_archives WHERE typeid = 50); -- 3. 删除标签关系表数据 DELETE FROM dede_taglist WHERE aid IN (SELECT id FROM dede_archives WHERE typeid = 50); -- 4. 删除评论数据 DELETE FROM dede_feedback WHERE aid IN (SELECT id FROM dede_archives WHERE typeid = 50);
说明:
- 将
50替换为你实际存放采集内容的栏目ID。 dede_addonarticle是默认文章模型的附加表,如果你的采集内容使用了其他模型(比如图集dede_addonimages,软件dede_addonsoft等),你需要将dede_addonarticle替换为对应的表名。- 执行前,强烈建议先备份数据库!以防误操作。
- 将
-
-
更新数据库缓存
- 执行完SQL删除后,为了确保数据一致性,建议去 “系统” -> “一键更新网站” -> “更新数据库缓存”,执行一次。
修改核心文件增加批量删除按钮(进阶)
如果你觉得每次都要用SQL命令不方便,可以修改文件,在列表页增加一个“批量删除”的按钮。此方法需要修改文件,升级时可能会被覆盖,请提前备份。
操作步骤:
-
找到并修改列表模板文件
- 的列表文件通常位于
/dede/templets/目录下。 - 文件名可能是
co_do.php或相关的列表模板,但更常见的是,列表页面是动态生成的,逻辑文件在/dede/co_action.php中。 - 经过分析,
/dede/co_do.php是处理采集任务操作的核心文件,但列表页面的显示逻辑可能在其他地方,为了简化,我们直接在处理批量操作的文件里添加功能。
- 的列表文件通常位于
-
修改
/dede/co_do.php文件- 用FTP或服务器管理工具打开
/dede/co_do.php文件。 - 在文件中找到处理批量操作(如
batchDel)的代码段,如果没有,我们可以手动添加。 - 在合适的位置(在
case 'batchmove':的后面)添加一个新的case来处理批量删除。
// 在 co_do.php 中添加如下代码 // ... 其他 case 代码 ... case 'batchdel_collect': // 引入数据库操作类 require_once(DEDEINC.'/datalist.class.php'); // 获取选中的文章ID列表 $arcids = isset($arcids) && is_array($arcids) ? $arcids : array(); if (empty($arcids)) { ShowMsg('请先选择要删除的内容!', '-1'); exit(); } // 将ID数组用逗号连接成字符串 $idstr = implode(',', $arcids); // 1. 删除主表数据 $dsql->ExecuteNoneQuery("DELETE FROM `dede_archives` WHERE id IN ($idstr)"); // 2. 删除附加表数据 (这里以默认的文章模型为例) // 注意:如果你的采集内容使用了不同模型,需要动态获取表名或遍历所有可能的附加表 $dsql->ExecuteNoneQuery("DELETE FROM `dede_addonarticle` WHERE aid IN ($idstr)"); // 3. 删除标签关系 $dsql->ExecuteNoneQuery("DELETE FROM `dede_taglist` WHERE aid IN ($idstr)"); // 4. 删除评论 $dsql->ExecuteNoneQuery("DELETE FROM `dede_feedback` WHERE aid IN ($idstr)"); ShowMsg('批量删除成功!', 'javascript:;'); exit(); // ... 其他 case 代码 ...注意:
dede_addonarticle是默认文章模型的附加表,如果你的采集内容是图集,这里应该是dede_addonimages,为了通用性,你可能需要更复杂的逻辑来判断文章类型并删除对应的附加表,或者干脆只删除主表和公共表(如标签、评论),因为主表删除后,附加表里的“孤儿”数据也没关系。
- 用FTP或服务器管理工具打开
-
修改列表页模板,添加批量删除按钮和复选框
- 这是最关键的一步,你需要找到生成采集内容列表的模板文件,这个文件可能不是
.html,而是PHP文件直接生成的。 - 经过分析,采集任务的列表页面是在
/dede/co_main.php中通过DataList类渲染的,它的模板文件通常是/dede/templets/co_main.htm。 - 打开
/dede/templets/co_main.htm文件。 - 在列表的顶部操作栏(开始采集”、“重新采集”按钮旁边),添加一个“批量删除”按钮。
- 确保列表的每一行都有一个复选框,
name属性是arcids[],value是文章的ID。
修改
co_main.htm示例:<!-- 在工具栏按钮区域添加 --> <input type="button" name='batchDelBtn' value='批量删除' class="coolbg np" style="width:80px" onclick="CheckArcs('batchdel_collect')" /> <!-- 确保列表项中有这样的复选框 --> <td width="5%" align="center"> <input type='checkbox' name='arcids[]' value='<?php echo $fields['id']; ?>' /> </td>CheckArcs('batchdel_collect')是一个JavaScript函数,它会收集所有被勾选的复选框的value,然后提交到co_do.php,并传递action=batchdel_collect和arcids[]参数。
- 这是最关键的一步,你需要找到生成采集内容列表的模板文件,这个文件可能不是
-
检查并添加JavaScript函数
- 在
co_main.htm文件中,查找是否存在CheckArcs函数,如果不存在,你需要手动添加它。 - 这个函数通常在页面的底部。
function CheckArcs(goaction) { var myform = document.getElementById('listForm'); var arctype = ''; var id = ''; var msg = '你确定要执行此操作吗?'; if (goaction == 'batchdel_collect') { msg = '警告:此操作将永久删除所选内容,且不可恢复!确定要删除吗?'; } if (myform) { for (var i=0; i<myform.elements.length; i++) { var e = myform.elements[i]; if (e.name == 'arcids[]' && e.checked) { id += (id=='' ? e.value : ',' + e.value); } } } if (id == '') { ShowMsg('请先选择要操作的内容!', '-1'); return; } if (confirm(msg)) { myform.action = 'co_do.php?dopost='+goaction; myform.submit(); } } - 在
总结与建议
| 方法 | 优点 | 缺点 | 推荐人群 |
|---|---|---|---|
| SQL命令 | 安全,不修改核心文件,升级无忧,执行效率高。 | 需要手动输入SQL,对数据库操作不熟悉的人有风险。 | 所有用户,特别是新手和对系统稳定性要求高的用户。 |
| 修改文件 | 方便,在后台界面直接操作,用户体验好。 | 有风险,修改核心文件,系统升级后功能会丢失,需要重新修改。 | 有一定PHP和DedeCMS开发基础,且不介意在升级后重复修改的用户。 |
最终建议:
对于绝大多数用户,强烈推荐使用方法一(SQL命令),它虽然需要你手动操作一下,但这是最安全、最规范的做法,在执行删除SQL前,先用 SELECT 语句检查一遍,确保万无一失。
如果你是一个开发者,并且这个功能是你网站长期需要的,那么可以考虑使用方法二,并做好文件修改的记录,以便未来升级时进行同步。
