如何批量删除所有没有帖子的用户?


8

我有1万个用户,其中约98%的用户从未发布过帖子(我的意思是帖子不发表评论)。

我需要一种方法来批量删除0条帖子的用户。

该方法必须计算所有包含自定义帖子类型的帖子,并且必须使用适当的WordPress功能删除用户,就像在仪表板上手动删除它们一样,而不仅仅是在mysql上删除表/行,因为这可能会导致意外结果。

一个旧的插件可以做到这一点,但并未考虑所有帖子类型,因此无法真正使用。

任何帮助表示赞赏。


3
您可以在下面的答案中简单地重用代码:wordpress.stackexchange.com/a/231485/24875
Christine Cooper

Answers:


8

如果要删除大量用户,则可以考虑使用wp user delete wp-cli命令来避免脚本超时。

这是删除所有没有任何类型和状态的帖子的所有用户的SQL查询示例。

因此,您可以尝试以下未经测试的单线:

wp user delete $(wp db query "SELECT ID FROM wp_users WHERE ID NOT IN (SELECT DISTINCT post_author FROM wp_posts ) AND ID NOT IN (1,2,3)" | tail -n +2 ) --reassign=1

或扩展形式:

wp user delete $(wp db query
    "SELECT ID  
         FROM wp_users   
         WHERE ID NOT IN (  
            SELECT DISTINCT post_author FROM wp_posts 
         ) AND ID NOT IN (1,2,3)" | tail -n +2 
  ) --reassign=1

请注意,我们添加了一个额外的AND ID NOT IN (1,2,3)限制,以确保不删除这些用户(例如admin用户)。您将不得不根据需要以及表前缀对其进行调整wp_

当我对几个用户进行简短测试时,我注意到我不得不添加该tail -n +2部分以避免wp db query输出的标题和表边框中的前三行。

在这里,我们将所有帖子重新分配给用户1,以避免发出通知:

--reassign parameter not passed. All associated posts will be deleted. Proceed? [y/n] 

希望您可以根据需要进一步调整它,例如通过添加来放松用户删除条件WHERE post_status = 'publish'

注意:测试前请记住备份!


我不明白 重新发布帖子不应该发生我不想删除仅发布了0条帖子的用户,所以不应该重新声明。
迈克尔·罗杰斯

1
它不会影响此特定示例,因为我们以任何帖子类型和状态为目标。这只是为了避免注意到wp delete user命令。您也可以跳过它,然后按Y--yes全部使用。如果将sql修改为仅删除发布了帖子的用户,则可能需要它来避免删除例如草稿。请注意,您在问题中提到的用户从未发布过帖子 ..严格来说,这可能意味着他们可能有草稿。我以为您没有考虑到这一点;-)请在问题中非常具体地说明要删除的内容,以避免猜测。@MichaelRogers
birgire

4

这是用PHP做到的一种方法。它可能很慢和/或超时,但是由于它是一次性的,所以没什么大不了的。暂时放置在您的functions.php中或作为新插件上传。

//* You don't want to run this on admin_init. Run it once and deactivate
add_action( 'admin_init', 'wpse_262100_admin_init' );
function wpse_262100_admin_init() {
  $reserved_post_types = [
    'attachment',
    'revision',
    'nav_menu_item',
    'custom_css',
    'customize_changeset',
  ];

  //* Get the non-reserved post types
  $post_types = array_diff( array_keys( get_post_types() ), $reserved_post_types );
  foreach( get_users() as $user ) {
    if( 0 == count_user_posts( $user->ID, $post_types ) ) {
      wp_delete_user( $user->ID );
    }
  }
}

1

从您提到的旧插件的源代码来看,它不考虑的帖子类型是附件修订版。我认为您可以通过从插件文件no-posts-user-delete.php的源代码中删除它来轻松解决此问题。

    AND NOT WP.post_type in ('attachment', 'revision')

抱歉! 我的意思是自定义帖子类型。作者在支持论坛上写道,它不仅将自定义帖子类型计算为“帖子”,因此它将删除进行自定义帖子的用户,这不好。
迈克尔·罗杰斯

@MichaelRogers我认为他不是那个意思。正如我所说的,唯一不计数的类型是我写的两种类型。因此,插件应会影响自定义帖子类型。它们存储在同一数据库表中。我建议您做一个备份,然后尝试使用该插件,看看它是否可以按照您想要的方式工作。如果不是,请还原备份。
Nikolay
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.