有效地删除自定义帖子类型的所有帖子


8

我正在寻找一种安全快捷的方法来删除一个自定义帖子类型的所有帖子。对返回的帖子使用get_posts()wp_delete_post()均无效;由于涉及的数据库查询数量庞大(超时错误),因此速度不够快。

最好是,我正在寻找一个要删除所有自定义帖子类型的帖子的数据库查询来运行。有什么想法吗?


这是一次性活动吗?如果是这样,通过phpMyAdmin进行快速SQL查询似乎最简单。如果这是一个需要通过编程/重复进行的整理步骤,那将对您没有帮助。
jdm2112

不幸的是,它需要定期进行,而无需手动访问数据库。
Marcus McLean 2015年

收到。我建议wpdb然后去上课。直接与数据库一起使用的首选方法和“ WP方式”。让我们知道您是否需要有关该查询的帮助。如果需要,我可以稍后发布完整答案codex.wordpress.org/Class_Reference/wpdb
jdm2112

2
使用'fields' => 'ids',get_posts只得到帖子的ID。这就是您所需要的,它将大大加快您的查询速度
Pieter Goosen 2015年

1
@MarcusMcLean:显然,您错过了我的观点;)单个帖子在posts表,postmeta表,分类表以及可能的options表中都有数据。您编写的用于删除这些帖子的任何纯SQL查询都将非常复杂。您很有可能将那些东西遗留在那些不同的表中。我会尝试使用Core函数以5分钟的间隔每次删除50个,以及wp_cron()
s_ha_dum 2015年

Answers:


17

您可以通过删除所有帖子 $wpdb

DELETE FROM wp_posts WHERE post_type='post_type';
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);
DELETE FROM wp_term_relationships WHERE object_id NOT IN (SELECT id FROM wp_posts)

或使用此查询将您的自定义帖子类型替换为{{your CPT}}

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 = '{{your CPT}}';

1
这可能会很好地工作,但不要忘记其中一个术语表中的术语计数。WordPress应该具有更新此功能的功能。
Joel M,

用户在用户屏幕上也有帖子计数,不确定该数据是预先保存还是在页面加载时计算。
Joel M

1
@JoelM count列存在于数据库表中wp_term_taxonomy。好像你正在寻找更新计数功能wp_update_term_count($terms, $taxonomy, false)wp_update_term_count_now($terms, $taxonomy)定义wp-includes/taxonomy.php
肯(Ken)

2

您可以通过多种方法删除自定义帖子类型的所有帖子,但是在这里,我将向您展示如何在不使用SQL查询的情况下执行此操作。例如,在这里,我们的帖子类型是产品

$allposts= get_posts( array('post_type'=>'product','numberposts'=>-1) );
foreach ($allposts as $eachpost) {
wp_delete_post( $eachpost->ID, true );
}

在此处查看完整的教程参考


再次阅读该OP:“使用get_posts()wp_delete_post()对于每个返回的帖子均不起作用;由于涉及的数据库查询数量巨大(超时错误),因此速度不够快。” 您正在使用他不想使用的两个功能。
迈克(Mike)
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.