织梦cms栏目文章批量移动

批量移动文章的场景

网站运营中经常需要将一个栏目下的文章批量移动到另一个栏目。常见场景包括:网站改版重新规划栏目结构、合并或拆分栏目、纠正发布到错误栏目的文章、归档旧文章到历史栏目等。

一、后台手动移动(适合少量文章)

  1. 进入 核心 > 内容管理,找到目标栏目
  2. 勾选需要移动的文章(逐条勾选)
  3. 点击"批量维护""移动"按钮
  4. 在弹出的窗口中选择目标栏目
  5. 确认移动操作
限制:后台批量操作通常一次只能处理一页(默认20-50条)的文章,不适合大批量迁移。

二、通过SQL批量移动(推荐)

对于大批量文章迁移,最有效的方法是直接操作数据库:

2.1 将指定栏目的全部文章移动到目标栏目

-- 将栏目ID=5的所有文章移动到栏目ID=8
UPDATE dede_archives SET typeid=8 WHERE typeid=5;
UPDATE dede_arctiny SET typeid=8 WHERE typeid=5;

-- 同时更新文章中的栏目名称缓存(如有)
UPDATE dede_archives 
SET typeid2=CASE WHEN typeid2=5 THEN 8 ELSE typeid2 END 
WHERE typeid2=5;

2.2 按条件批量移动

-- 将栏目5中2023年之前的文章移动到栏目8
UPDATE dede_archives SET typeid=8 
WHERE typeid=5 AND pubdate < UNIX_TIMESTAMP('2024-01-01');

UPDATE dede_arctiny SET typeid=8 
WHERE typeid=5 AND pubdate < UNIX_TIMESTAMP('2024-01-01');

-- 将栏目5中点击量低于100的文章移动到栏目8
UPDATE dede_archives SET typeid=8 
WHERE typeid=5 AND click < 100;

2.3 移动指定文章ID范围

-- 将ID在100-200之间的文章从栏目5移到栏目8
UPDATE dede_archives SET typeid=8 
WHERE typeid=5 AND id BETWEEN 100 AND 200;

UPDATE dede_arctiny SET typeid=8 
WHERE typeid=5 AND id BETWEEN 100 AND 200;

三、通过PHP脚本批量移动

编写PHP脚本实现更复杂的移动逻辑:

<?php
require_once(dirname(__FILE__)."/include/common.inc.php");

$from_typeid=5;  // 源栏目ID
$to_typeid=8;    // 目标栏目ID
$limit=100;      // 每批处理数量

$sql="UPDATE dede_archives SET typeid={$to_typeid} 
        WHERE typeid={$from_typeid} LIMIT {$limit}";
$dsql->ExecuteNoneQuery($sql);

$sql2="UPDATE dede_arctiny SET typeid={$to_typeid} 
         WHERE typeid={$from_typeid} LIMIT {$limit}";
$dsql->ExecuteNoneQuery($sql2);

echo $limit . " 篇文章已从栏目{$from_typeid}移动到栏目{$to_typeid}";

// 更新栏目文章计数
UpDateCatCache();
?>

四、移动后必须执行的操作

  1. 更新栏目缓存:运行 UpDateCatCache() 函数更新各栏目的文章计数
  2. 重新生成HTML
    • 重新生成源栏目的HTML(移除已移动的文章)
    • 重新生成目标栏目的HTML(包含新移入的文章)
    • 重新生成被移动文章的详情页HTML
  3. 更新系统缓存系统 > 更新系统缓存
  4. 检查前台显示:访问源栏目和目标栏目确认文章显示正确

五、涉及的所有关联表

移动文章时需要更新以下表以确保数据一致:

表名需要更新的字段
dede_archivestypeid(主栏目ID),typeid2(副栏目ID)
dede_arctinytypeid
dede_arctype栏目文章计数(缓存更新后自动修正)
操作建议:大批量移动前务必先备份数据库。建议分批执行(每批100-500条),并在服务器低峰时段操作,避免长时间锁表影响网站正常访问。