本指南提供有关如何在自托管 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
附加信息
有关其他管理操作的更多信息,请参阅: