dede批量移动副栏目

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 DEDE建站 正文
  1. SQL命令批量修改(推荐,最高效)
  2. PHP脚本批量修改(适合复杂逻辑)

⚠️ 重要操作前必读

在执行任何数据库操作之前,务必备份数据库! 这是最重要的安全措施,可以防止误操作导致数据丢失。

dede批量移动副栏目
(图片来源网络,侵删)
  • 如何备份数据库?
    • 登录你的主机控制面板(如 cPanel, Plesk, 宝塔面板等)。
    • 找到“数据库”或“phpMyAdmin”功能。
    • 选择你的织梦数据库,点击“导出”或“备份”,选择“快速”格式,然后下载备份文件(.sql)到本地保存。

使用SQL命令批量修改(推荐)

这是最直接、最快的方法,我们需要修改的是 dede_arctype 表(栏目表)中的两个关键字段:

  • typedir: 栏目的目标路径。
  • reid: 栏目的父栏目ID。

步骤1:准备信息

  1. 获取要移动的副栏目ID列表:确定你想要移动的所有副栏目的ID,你可以在后台“栏目管理”中看到这些ID。
  2. 获取目标父栏目的ID:确定这些副栏目要被移动到哪个主栏目下,并记下这个目标主栏目的ID。

步骤2:执行SQL命令

登录你的phpMyAdmin,选择你的织梦数据库,然后点击“SQL”标签页,输入以下命令。

场景A:将多个副栏目移动到同一个新的父栏目下

假设我们要将ID为 5, 6, 7 的三个副栏目,全部移动到ID为 100 的主栏目下。

SQL命令:

dede批量移动副栏目
(图片来源网络,侵删)
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命令:

dede批量移动副栏目
(图片来源网络,侵删)
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命令执行完毕后,栏目关系已经改变,但织梦的缓存还是旧的,必须更新缓存才能让前台和后台正常显示。

  1. 登录织梦后台。
  2. 点击顶部菜单的 “系统” -> “一键更新网站”
  3. 在左侧菜单中,勾选 “更新栏目缓存”
  4. 点击“开始更新”。

完成这一步后,批量移动操作就成功了。


使用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脚本:

  1. 将上面的代码保存为 move_cats.php 文件。
  2. 通过FTP或文件管理器,将其上传到你的织梦网站根目录。
  3. 在浏览器中访问 http://你的域名/move_cats.php
  4. 脚本执行完毕后,务必删除这个文件,以免留下安全隐患。
  5. 同样需要去后台“更新栏目缓存”
方法 优点 缺点 适用场景
SQL命令 速度最快,效率最高,直接对数据库操作 需要phpMyAdmin权限,对新手有一定门槛,操作前必须备份数据库。 绝大多数批量移动场景,特别是数量多的时候。
PHP脚本 灵活性高,可以嵌入复杂的业务逻辑 需要编写代码,上传和删除文件,效率相对SQL低。 需要根据动态条件(如栏目名称匹配)来移动栏目的复杂情况。

对于绝大多数用户来说,方法一(SQL命令) 是最佳选择,请务必牢记操作前备份数据库,操作后更新缓存。

-- 展开阅读全文 --
头像
dede模板 政府机关
« 上一篇 前天
dede如何精确控制调用文章的篇数?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

目录[+]