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

时间:2017-04-01 作者:Michael Rogers

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

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

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

an old plugin 这可以做到这一点,但并没有考虑所有的帖子类型,所以不能真正使用。

感谢您的帮助。

3 个回复
SO网友:birgire

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

Here\'s 删除所有用户的SQL查询示例without posts of any type and status.

因此,您可以尝试使用未经测试的一行程序:

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) 确保未删除这些用户(例如管理员用户)的限制。您必须根据自己的需要以及表格前缀进行调整wp_.

当我为几个用户简要测试时,我注意到我必须添加tail -n +2 部分以避免标题和表格边框中的前3行wp db query 输出

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

--reassign parameter not passed. All associated posts will be deleted. Proceed? [y/n] 
希望您可以根据自己的需要进一步调整,比如通过添加WHERE post_status = \'publish\'.

Note: 请记住在测试前备份!

SO网友:Nathan Johnson

这里有一种用PHP实现的方法。它可能会很慢和/或超时,但由于这是一次性的,所以不应该太重要。暂时放置在函数内部。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 );
    }
  }
}

SO网友:Nikolay

根据您提到的旧插件的源代码判断,它没有考虑的帖子类型有attachmentrevision. 我认为您可以通过从插件文件no posts user delete的源代码中删除它来轻松修复此问题。php

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

相关推荐

使WordPress在USERS屏幕上显示wp_USERS表时,将默认用户元与另一个表中的列联接

我正在创建一个插件,将自定义的可排序列(声誉分数)添加到admin page>users中显示的users表中,问题是该列的数据应该从MySQL表wp\\U user\\U Reputation中提取(userid,user_reputation_score) [为我们自己的目的而创建]。我的评估是,我需要在查询中显示该列,以便为其添加排序功能。如何使make WordPress以wp\\u user\\u信誉加入wp\\u users表。我感谢你的帮助。