web-dev-qa-db-ja.com

投稿のないすべてのユーザーを一括削​​除する方法

私はこれらのユーザーの98%が1度も投稿を公開していないユーザーを1万人持っています(私は投稿がコメントではないことを意味します)。

私は0の投稿を持つユーザを一括削除する方法が必要です。

このメソッドはカスタム投稿タイプを含むすべての投稿をカウントしなければならず、ユーザーがダッシュボードで手動で削除されたように適切なWordPress関数を使用しなければなりません。

古いプラグインがあります これはすべての投稿タイプを考慮していないので、実際には使用できません。

任意の助けをいただければ幸いです。

8
Michael Rogers

削除するユーザー数が多い場合は、 wp user deletewp-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_に適応させる必要があるでしょう。

2人のユーザーに対してこれを簡単にテストしたところ、ヘッダーの上位3行とtail -n +2出力の表の罫線を避けるためにwp db query部分を追加する必要があることに気付きました。

ここでは、通知を避けるために、すべての投稿をユーザー1に再割り当てしています。

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

WHERE post_status = 'publish'を追加してユーザーの削除条件を緩和するなど、自分のニーズに合わせてさらに調整できることを願います。

注: テストの前に必ずバックアップを取ってください。

8
birgire

これは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 );
    }
  }
}
4
Nathan Johnson

あなたが言及した古いプラグインのソースコードから判断すると、それが考慮しない投稿タイプは attachmentrevision です。私はあなたがプラグインファイルno-posts-user-delete.phpのソースコードからこれを取り除くことによってこれを簡単に直せると思う。

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