批量移动文章的场景
网站运营中经常需要将一个栏目下的文章批量移动到另一个栏目。常见场景包括:网站改版重新规划栏目结构、合并或拆分栏目、纠正发布到错误栏目的文章、归档旧文章到历史栏目等。
一、后台手动移动(适合少量文章)
- 进入
核心 > 内容管理,找到目标栏目 - 勾选需要移动的文章(逐条勾选)
- 点击"批量维护"或"移动"按钮
- 在弹出的窗口中选择目标栏目
- 确认移动操作
限制:后台批量操作通常一次只能处理一页(默认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();
?>
四、移动后必须执行的操作
- 更新栏目缓存:运行
UpDateCatCache()函数更新各栏目的文章计数 - 重新生成HTML:
- 重新生成源栏目的HTML(移除已移动的文章)
- 重新生成目标栏目的HTML(包含新移入的文章)
- 重新生成被移动文章的详情页HTML
- 更新系统缓存:
系统 > 更新系统缓存 - 检查前台显示:访问源栏目和目标栏目确认文章显示正确
五、涉及的所有关联表
移动文章时需要更新以下表以确保数据一致:
| 表名 | 需要更新的字段 |
|---|---|
dede_archives | typeid(主栏目ID),typeid2(副栏目ID) |
dede_arctiny | typeid |
dede_arctype | 栏目文章计数(缓存更新后自动修正) |
操作建议:大批量移动前务必先备份数据库。建议分批执行(每批100-500条),并在服务器低峰时段操作,避免长时间锁表影响网站正常访问。