- SQL命令批量修改(推荐,最高效)
- PHP脚本批量修改(适合复杂逻辑)
⚠️ 重要操作前必读
在执行任何数据库操作之前,务必备份数据库! 这是最重要的安全措施,可以防止误操作导致数据丢失。

(图片来源网络,侵删)
- 如何备份数据库?
- 登录你的主机控制面板(如 cPanel, Plesk, 宝塔面板等)。
- 找到“数据库”或“phpMyAdmin”功能。
- 选择你的织梦数据库,点击“导出”或“备份”,选择“快速”格式,然后下载备份文件(.sql)到本地保存。
使用SQL命令批量修改(推荐)
这是最直接、最快的方法,我们需要修改的是 dede_arctype 表(栏目表)中的两个关键字段:
typedir: 栏目的目标路径。reid: 栏目的父栏目ID。
步骤1:准备信息
- 获取要移动的副栏目ID列表:确定你想要移动的所有副栏目的ID,你可以在后台“栏目管理”中看到这些ID。
- 获取目标父栏目的ID:确定这些副栏目要被移动到哪个主栏目下,并记下这个目标主栏目的ID。
步骤2:执行SQL命令
登录你的phpMyAdmin,选择你的织梦数据库,然后点击“SQL”标签页,输入以下命令。
场景A:将多个副栏目移动到同一个新的父栏目下
假设我们要将ID为 5, 6, 7 的三个副栏目,全部移动到ID为 100 的主栏目下。
SQL命令:

(图片来源网络,侵删)
UPDATE dede_arctype
SET
reid = 100, -- 将父ID修改为目标父栏目的ID
typedir = (SELECT typedir FROM dede_arctype WHERE id = 100) + '/' + `typedir` -- 重新计算路径
WHERE
id IN (5, 6, 7); -- 将id IN (...) 中的ID替换成你要移动的副栏目ID
命令解释:
UPDATE dede_arctype: 指定要修改的表是dede_arctype。SET reid = 100: 将所有满足条件的栏目的父ID都设置为100。SET typedir = ...: 这是最关键的一步,它会自动重新计算这些栏目的路径,使其成为新父栏目的子栏目。(SELECT typedir FROM dede_arctype WHERE id = 100): 查询出目标父栏目的完整路径。- 用斜杠连接路径。
`typedir`: 原副栏目自己的路径名称部分。
WHERE id IN (5, 6, 7): 这是筛选条件,只修改ID为5、6、7的栏目。
场景B:将多个副栏目移动到各自不同的父栏目下
如果每个副栏目要移动到的父栏目都不同,我们需要使用 CASE 语句。
假设:
- 副栏目
5要移动到父栏目100。 - 副栏目
6要移动到父栏目101。 - 副栏目
7要移动到父栏目102。
SQL命令:

(图片来源网络,侵删)
UPDATE dede_arctype
SET
reid = CASE id
WHEN 5 THEN 100
WHEN 6 THEN 101
WHEN 7 THEN 102
END,
typedir = CASE id
WHEN 5 THEN (SELECT typedir FROM dede_arctype WHERE id = 100) + '/栏目5的路径名'
WHEN 6 THEN (SELECT typedir FROM dede_arctype WHERE id = 101) + '/栏目6的路径名'
WHEN 7 THEN (SELECT typedir FROM dede_arctype WHERE id = 102) + '/栏目7的路径名'
END
WHERE
id IN (5, 6, 7);
⚠️ 注意:在场景B中,typedir 的更新可能无法完全自动化,因为织梦的路径结构可能比较复杂,更稳妥的做法是只修改 reid,然后通过织梦的“更新栏目缓存”功能来自动修正所有路径。
简化版的场景B命令(只修改父ID):
UPDATE dede_arctype
SET
reid = CASE id
WHEN 5 THEN 100
WHEN 6 THEN 101
WHEN 7 THEN 102
END
WHERE
id IN (5, 6, 7);
步骤3:更新栏目缓存
SQL命令执行完毕后,栏目关系已经改变,但织梦的缓存还是旧的,必须更新缓存才能让前台和后台正常显示。
- 登录织梦后台。
- 点击顶部菜单的 “系统” -> “一键更新网站”。
- 在左侧菜单中,勾选 “更新栏目缓存”。
- 点击“开始更新”。
完成这一步后,批量移动操作就成功了。
使用PHP脚本批量修改(适合复杂逻辑)
如果你需要更复杂的判断逻辑(根据栏目名称、关键词等来决定移动到哪里),可以写一个PHP脚本放在网站根目录下执行。
示例脚本:move_cats.php
<?php
// 1. 引入织梦数据库配置文件
// 注意:如果你的dedecms不是在根目录,请修改路径
require_once (dirname(__FILE__) . "/include/common.inc.php");
// 2. 定义移动规则
// 格式: array( '要移动的副栏目ID' => '目标父栏目ID' )
$move_rules = array(
5 => 100, // 将ID为5的栏目移动到ID为100的栏目下
6 => 100, // 将ID为6的栏目也移动到ID为100的栏目下
7 => 102, // 将ID为7的栏目移动到ID为102的栏目下
// 可以继续添加...
);
// 3. 执行批量移动
foreach ($move_rules as $child_id => $parent_id) {
// 使用织梦自带的函数更新栏目,这样可以同时更新路径和缓存
// 但此函数通常用于单个更新,批量效率不高。
// 更高效的方式还是直接执行SQL,然后最后统一更新缓存。
// 这里我们选择直接执行SQL,与方法一保持一致
$query = "UPDATE `{$dbprefix}arctype` SET `reid` = '$parent_id' WHERE `id` = '$child_id'";
$dsql->ExecuteNoneQuery($query);
echo "已将栏目 ID: $child_id 移动到父栏目 ID: $parent_id <br />";
}
// 4. 手动触发更新栏目缓存(织梦没有直接的API函数,需要模拟)
// 更推荐的是手动去后台点击“更新栏目缓存”
echo "<br />所有栏目移动完毕!请登录后台执行【系统 -> 一键更新网站 -> 更新栏目缓存】以完成最终操作。";
// 5. 安全起见,执行完毕后删除此文件
// if (file_exists(__FILE__)) {
// unlink(__FILE__);
// }
?>
如何使用PHP脚本:
- 将上面的代码保存为
move_cats.php文件。 - 通过FTP或文件管理器,将其上传到你的织梦网站根目录。
- 在浏览器中访问
http://你的域名/move_cats.php。 - 脚本执行完毕后,务必删除这个文件,以免留下安全隐患。
- 同样需要去后台“更新栏目缓存”。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SQL命令 | 速度最快,效率最高,直接对数据库操作 | 需要phpMyAdmin权限,对新手有一定门槛,操作前必须备份数据库。 | 绝大多数批量移动场景,特别是数量多的时候。 |
| PHP脚本 | 灵活性高,可以嵌入复杂的业务逻辑 | 需要编写代码,上传和删除文件,效率相对SQL低。 | 需要根据动态条件(如栏目名称匹配)来移动栏目的复杂情况。 |
对于绝大多数用户来说,方法一(SQL命令) 是最佳选择,请务必牢记操作前备份数据库,操作后更新缓存。
