删除整个CPT/多个帖子的DELETE_POST_META()?

时间:2013-12-08 作者:Wordpressor

我正在清理一个主题,其中一个自定义帖子类型有一些奇怪的、早已过时的自定义字段。

我想删除它们,不幸的是delete\\u post\\u meta()以post->ID作为参数,而我想对所有帖子执行此操作,而不是只对一篇帖子执行此操作。

我该怎么做?使用循环?假设CPT被称为“custom\\u photos”,每个帖子都有这些自定义字段。

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

据我所知,内核缺少用于这种批量删除的功能。最安全的做法是循环CPT中的帖子并删除字段。

$del = array(
  \'list\',
  \'of\',
  \'keys\',
  \'to\',
  \'delete\'
);

$args = array(
  \'post_type\' => \'book\',
  \'posts_per_page\' => -1,
  \'ignore_sticky_posts\' => true,
  \'fields\' => \'ids\',
  \'no_found_rows\' => true
);
$q = new WP_Query($args);

if (!empty($q->posts)) {
  foreach ($q->posts as $pid) {
    foreach ($del as $d) {
      delete_post_meta($pid,$d);
    }
  }
}
除非您在该CPT中有大量的帖子,或者服务器负载过重,否则这对于偶尔的清理应该很好。

如果这些字段特定于您的一种帖子类型,并且您不担心丢失可能与其他帖子类型相关的数据,那么您可以对SQL.

$del = array(
  \'list\',
  \'of\',
  \'keys\',
  \'to\',
  \'delete\'
);

$sql = "DELETE FROM {$wpdb->postmeta} WHERE meta_key IN (\'".implode("\',\'",$del)."\')";
$wpdb->query($sql);
当然,由于数据库结构可能会发生变化,这在某种程度上不太“经得起未来考验”,尽管在这种情况下我对此表示怀疑。

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在