投稿のないすべてのユーザーを一括削​​除するにはどうすればよいですか?


8

私は1万人のユーザーがいて、これらのユーザーの約98%が投稿を公開していません(つまり、コメントではなく投稿です)。

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

このメソッドは、カスタム投稿タイプを含むすべての投稿をカウントする必要があり、ユーザーがダッシュボードで手動で削除されたかのように、適切なWordPress関数を使用してユーザーを削除する必要があります。これは、予期しない結果を引き起こす可能性があるため、mysqlでテーブル/行をドロップするだけではありません。

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

助けてくれてありがとう。


3
ここで私の回答のコードを単純に再利用できます:wordpress.stackexchange.com/a/231485/24875
Christine Cooper

回答:


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)これらのユーザー(管理者ユーザーなど)が削除されないように、追加の制限を追加したことに注意してください。あなたはそれをあなたのニーズとテーブルプレフィックスに合わせて調整する必要があります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'

注:テストを行う前に、必ずバックアップしてください。


わかりません。投稿の再確認は行わないでください投稿が0のユーザーのみを投稿したユーザーを削除したくないので、再確認は行われません。
マイケルロジャース

1
投稿のタイプとステータスを対象にしているため、この特定の例には影響しません。これは、wp delete userコマンドの通知を回避するためだけのものでした。スキップして、押すY--yes、すべて使用することもできます。投稿を公開したユーザーのみを削除するようにsqlを変更する場合、ドラフトなどの削除を回避するために必要になる場合があります。投稿を公開したことのないユーザーの質問で言及したことに注意してください。厳密には、下書きがある可能性があることを意味します。私はあなたがそれを念頭に置いていなかったと思いました;-)当て推量を避けるために何を削除したいか質問で非常に具体的にしてください。@MichaelRogers
バージレ

4

PHPでこれを行う方法を次に示します。遅くなったりタイムアウトしたりする可能性がありますが、これは1回限りのものであるため、あまり問題にしないでください。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彼がそれを意味しているとは思いません。言ったように、数えられないタイプは私が書いた2つだけです。したがって、プラグインはカスタム投稿タイプに影響を与えるはずです。それらは同じデータベーステーブルに格納されます。バックアップを行ってからプラグインを試して、期待どおりに機能するかどうかを確認することをお勧めします。そうでない場合は、バックアップを復元します。
ニコライ2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.