批量删除帖子修订的最安全方法


8

我的一位客户在帖子数量和访问量方面都在一个相当大的博客上。我正在尝试将她的数据库缩小到可管理的大小,而堆积如山的一件事实际上是数以万计的后期修订。

我已经设置了Wordpress配置,以限制将来的修订版本数为两个:

define('WP_POST_REVISIONS', 2);

但是我想删除所有现有的修订。

问题1:直接删除wp_posts表中所有具有post_type修订版本的行是否安全?(我已经看到了与此矛盾的答案,但我希望能够在安全的情况下以这种方式进行操作)。

问题2…如果我只是直接从问题1中删除,这只是无关紧要的:

我在Songdogtech提供安全删除数据库查询的地方找到了这个答案,但是(1)专门针对多站点问题(这是一个站点)的答案,(2)我刚刚将该站点升级到3.6,其中包括数据库更改。(因此,我在阅读数据库查询方面不够熟练,无法确切了解那里正在发生什么以及它是否适用于WP 3.6中的单个站点

Answers:


18

直接删除wp_posts表中所有具有post_type修订版本的行是否安全?(我已经看到了与此矛盾的答案,但我希望能够在安全的情况下以这种方式进行操作)

安全,很安全

如果只有一个用户(您)可以编辑网站上的帖子,那么这是安全的,不会造成任何其他问题。

如果有更多的用户,并且有人正在编辑帖子,同时删除修订,这仍然不是不安全的,但是对于那些看到修订消失的用户可能会很烦。

绝对不安全的是在WP数据库上运行SQL查询,而不先进行一个(或更好,更多)负担得起的备份,并事先在本地/开发环境中测试该查询。

假设您不小心键入'post'而不是'revision',如果没有备份并且在生产站点上运行查询,会发生什么?

关于第二个问题,只是删除{id}_无处不在它出现在查询贴出这样wp_{id}_postswp_posts等。

一个警告wp_部分是标准的表前缀,即在WP安装过程中,帅哥更改为其他内容。

如果您更改了它,并且wp_config.php您看到了$table_prefix = 'something_else_than_wp_';

您的查询变为:

DELETE a,b,c
FROM something_else_than_wp_posts a
LEFT JOIN something_else_than_wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN something_else_than_wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

我建议这样进行:

  1. 备份数据库
  2. 再次备份数据库
  3. 通过在另一个数据库中还原数据库来测试备份
  4. 更改您的“ wp_config”以使用此新数据库
  5. 在新数据库上运行查询,并检查是否出了问题
  6. 如果没有,则完成。如果是这样,请再次更改“ wp_config”,使其使用数据库并尝试调查问题。

谢谢。正是我想听到的。是的,对于所有备份,等等
。– StudioAl 2013年

2
1. Backup DB 2. Backup DB Again,我喜欢这部分,为此+1。
shyammakwana.me,2015年

您甚至可以创建自定义wp-cli命令来自动化您的工作流程:$ wp post delete $(wp post list --post_type='revision' --format=ids)
Dharma

4

到目前为止提供的详细信息充其量是不完整的,并且a,b,c查询也不是很好-甚至可能很危险。它忘记考虑很多潜在的依赖性。有一个充分的讨论和更好的查询这里

还有查询的修订版本,它应该好得多,但是可以在低风险的开发环境和备份中进行测试:

特别:

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
LEFT JOIN wp_term_taxonomy d ON ( b.term_taxonomy_id = d.term_taxonomy_id)
WHERE a.post_type = 'revision'
AND d.taxonomy != 'link_category';

此查询处理较旧的数据,其中WordPress可能在wp_term_relationships表中使用相同的object_id作为帖子和链接。通过运行此a,b,c查询的其他版本,您也可以无意中删除链接数据。这与新安装的WordPress无关紧要。

如果运行该版本的查询并删除0个,则仅表示wp_term_taxonomy表中没有“ link_category”条目。您可以通过检查该表来进行验证,然后删除最后一行并再次运行查询。

但是在用于生产数据之前,请确保备份,测试并验证结果。在优化之后,此查询将我的修订版wp_posts表中的一个从300 MB减少到5 MB。


请发布真实的解决方案,而不是指向可能有人找到解决方案的链接
Pieter Goosen

好!会做的-首先进行自我测试以确保其有效。
安德鲁(Andrew)

2

运行SQL查询:

DELETE FROM wp_posts WHERE post_type = "revision" // for "wptest" DB, note the table name

注意:上面的查询“只是删除标记为修订的帖子。如果由于某种原因,您将修订与标签或类别相关联,而该标签或类别在发布最终文章时被删除,则在其他表格(例如字词)中会有额外的条目。” 安全删除所有修订的正确查询如下(必要时更改表前缀):

DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'

感谢您对查询的澄清。很有道理。
StudioAl 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.