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

时间:2013-08-30 作者:StudioAl

就帖子数量和流量而言,我的一个客户在一个相当大的博客上。我正试图将她的数据库缩小到一个可管理的规模,但有一件事正在扩大,那就是成千上万的后期修订。

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

define(\'WP_POST_REVISIONS\', 2);
但我想删除所有现有的修订。

Question 1:直接删除wp\\U posts表中具有post\\U版本类型的所有行是否安全?(我在这方面看到了相互矛盾的答案,但如果安全的话,我希望能这样做)。

Question 2:…只有当我NOT 只需简单地删除第一个问题:

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

3 个回复
最合适的回答,由SO网友:gmazzap 整理而成

直接删除wp\\U posts表中具有post\\U版本类型的所有行是否安全?(我在这方面看到了相互矛盾的答案,但如果安全的话,我希望能这样做)

安全,很安全。

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

如果有更多的用户,其中一个用户正在编辑一篇文章,同时您删除了修订,这仍然不是不安全的,但看到修订消失,可能会让该用户感到恼火。

什么是绝对unsafe 是在WP数据库上运行SQL查询,而无需进行一次(或更好、更多)经济的备份,也无需事先在本地/开发环境中测试查询。

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

关于第二个问题,请删除{id}_ 它出现在query posted 所以wp_{id}_posts 成为wp_posts 等等

A.warning, 这个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\'
我建议这样做:

备份数据库再次备份数据库通过在另一个数据库中还原数据库来测试备份更改“wp\\u config”以使用此新数据库,并在新数据库上运行查询,检查是否有问题,如果没有,则完成。如果是这样,请再次更改“wp\\u config”,让它使用旧数据库,并尝试调查问题

SO网友:Andrew

到目前为止,提供的详细信息充其量也不完整,而a、b、c查询并不好,甚至有潜在的危险。它忘记了考虑许多潜在的依赖关系。有充分的讨论和更好的查询here

还有this revised 查询的版本应该更好,但在低风险的开发环境和备份中测试:

具体而言:

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\\U term\\u relationships表中为帖子和链接使用相同的object\\u id。通过运行此a、b、c查询的其他版本,您也可以无意中删除链接数据。对于较新安装的WordPress来说,这并不是什么问题。

如果运行该版本的查询并得到0次删除,则只意味着在wp\\U term\\u分类表中没有“link\\u category”条目。您可以通过检查该表进行验证,然后删除最后一行并再次运行查询。

但在对生产数据使用之前,请确保备份、测试和验证结果。优化后,此查询将我的一个修订版膨胀的wp\\U posts表从300 MB降至5 MB。

SO网友:Tara

运行SQL查询:

DELETE FROM wp_posts WHERE post_type = "revision" // for "wptest" DB, note the table name
注意:上面的查询“只删除标记为修订的帖子。如果由于某种原因,您将修订与标记或类别相关联,然后在最终帖子发布时删除了标记或类别,则在其他表(如terms)中会有额外的条目。”安全删除所有修订的正确查询如下(根据需要更改表前缀):

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\'

结束

相关推荐

Can't match title in database

这很令人困惑,希望有人能帮助我。下面是我用来查看wp\\u posts表中是否存在标题的一些代码$mypostids = $wpdb->get_results(\"select ID from $wpdb->posts where post_title=\'$thisTitle\'\"); if(!empty($mypostids)){ echo $thisTitle.\' already exists\'; }else{ echo $t