本指南介绍了如何在自托管的 Discourse 实例中批量删除某个分类下的所有主题。
所需用户级别:系统管理员
需要能够 SSH 访问您的服务器
出于各种原因(例如重新组织内容或清除过时的讨论),可能需要从某个分类中删除所有主题。本指南将引导您安全地在自托管的 Discourse 服务器上完成此操作。
这是一个破坏性操作。请务必在继续之前备份您的论坛
删除分类中主题的步骤
- 确定分类的 slug:这是分类 URL 中使用的名称。
- 访问您的服务器:使用 SSH 登录到您的服务器。
ssh username@your-server.com
- 进入 Discourse 目录:
cd /var/discourse
- 进入 Discourse 应用环境:
./launcher enter app
- 执行删除命令:将
"mycategory"替换为您分类的 slug。
rake destroy:topics["mycategory"]
此过程可能需要一些时间,具体取决于主题的数量。
删除子分类中的主题
若要删除子分类中的主题,请在命令中包含父分类的 slug。例如:
rake destroy:topics["childcategory","parentcategory"]
删除所有分类中的所有主题
此操作将清除所有分类中的所有主题!
rake destroy:topics_all_categories
常见问题
Discourse 会保留已删除的主题多久?我仍然可以通过直接链接访问这些主题。
主题在删除后仍会保留在数据库中。只有工作人员仍能看到已删除的主题。
如何从数据库中永久删除主题?
您可以使用 destroy:posts rake 任务从数据库中永久删除帖子(及其对应的主题)。这需要先启用 can_permanently_delete 站点设置。
以逗号分隔的列表形式传递帖子 ID:
rake destroy:posts[4,8,15,16,23,42]
您也可以从文件中读取帖子 ID:
cat post_ids.txt | rake destroy:posts
是否可以将主题删除限制在特定时间段(两个日期之间)?
您需要通过 Rails 控制台操作,类似以下的命令应该可以生效:
Topic.where("created_at.....").each do |t|
first_post = t.ordered_posts.first
PostDestroyer.new(Discourse.system_user, first_post).destroy if first_post
end
如何查找我的分类 slug 或 ID?
destroy:topics 任务使用的是 分类 slug(即分类 URL 中的名称)。您可以通过运行以下命令列出所有分类及其 ID 和 slug:
rake categories:list
其他信息
有关其他管理操作的更多信息,请参阅: