web-dev-qa-db-ja.com

Wp_usersとwp_usermetaから一度に数千の加入者をすべて削除します。

私は70Kのスパム加入者がいるサイトを持っています、そして私はそれらのどれも必要としません。だから私はadminと/またはphpmyadminでクエリを使用してwp_usersからwp_usersとwp_usermetaから各ユーザーの関連メタからすべての購読者を削除する必要があります。

しかし、サーバーがクラッシュしないようにするには、どうすれば一度に数千個を削除できますか?

これは私が必要とする基本的な質問のようです。

DELETE
FROM  wp_users 
INNER JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
WHERE meta_key = 'wp_capabilities'
AND meta_value  LIKE '%subscriber%
//except how do I select a few thousand at a time?

しかし、どのように私は一度に数千を選ぶのですか?

2
markratledge

このようなことをするための私のお気に入りの方法はデータベースハッキング(私はいつも副作用があるのではないかと心配している)経由ではなく、コマンドラインツール経由です。

たとえば、機能的な WP CLIインストール を指定すると、次のように簡単に実行できます。

wp user delete $(wp user list --role=subscriber --field=ID --number=10) --reassign=1

reassignパラメータは、コンテンツの再割り当て先となるユーザーのユーザーIDです。 WP_User_Query がサポートしているので、 それはあまり文書化されていません _であっても "--number"(制限)を使うことができます。

そこにあなたはそれを持っています - このような操作をするためのきれいな、一行のコマンドラインユーティリティ。

この場合、最初に "wp user list .."という副照会を試して、どのユーザーを削除するのかを確認することをお勧めします。ワンライナーを実行すると、次のような情報が表示されます。

... Success: Removed user 123 from https://example.com/. Success: Removed user 124 from https://example.com/. ...

3
ryanm

私は同様の問題を抱えていて、この質問を読んだ後に私はこのプラグインを作りました(あなたの質問に適応しました)。

一度インストールすると、 adminメニュー under Users called Bulk User Delete になります。あなたのSQLクエリあたり(私の元のクエリは少し異なっていた)。

あなたはバッチをより小さくまたはより大きくすることができます、しかしこれはあなたがサーバーのタイムアウトなしで多くのユーザーを削除することを可能にします、それはたくさんのスパムサインアップのために数分かかるかもしれません。

それは各バッチが処理された後にページをリロードするためにjqueryを使用します(これは私が推測するajaxで行うことができますが、私はすぐに何かが必要です)。

たぶん他の誰かがこれが役に立つと思うでしょう、あなたはたぶんあなたの状況にSQLクエリを適応させる必要があるでしょう。

    <?php 
    /*
    Plugin Name: Bulk Delete Spam Users
    Description: Delete the spam sign ups
    Version: 0.1
    Author: Steven
    Text Domain: bulk-delete-spam-users
    */

    add_action('admin_menu', 'my_users_menu');
    function my_users_menu() {
        add_users_page('Bulk User Delete', 'Bulk User Delete', 'read', 'bulk-user-delete', 'active_users_nodel');
    }

    function active_users_nodel() {
        global $wpdb;
        $result = array();
        $result = $wpdb->get_results('
            SELECT wp_users.id, wp_users.user_login FROM wp_users 
            INNER JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
            WHERE meta_key = "wp_capabilities"
            AND meta_value  LIKE "%subscriber%"
        ');

        $users = $result;
        $i = 0;
        echo '<div class="bud-box">';

        $users_remain = $users ? 'true' : 'false';

        $current_user = wp_get_current_user();
        echo '<strong>Orphaned content will be reassigned to:</strong><br />';
        echo 'Username: ' . $current_user->user_login . '<br />';
        echo 'User ID: ' . $current_user->ID . '<br />';

        <h3>currently deleting...</h3>

        foreach($users as $user) {
            $i++;
            if($i < 20) {
                wp_delete_user( $user->ID, $current_user->ID );
                var_dump($user->user_login);
            }
        }
        echo '</div>';
        ?>

        <script>
            (function($){
                $(document).ready(function(){
                    var uremain = <?php echo $users_remain; ?>;
                    if( uremain == true){
                        location.reload(); 
                    }
                });
            })(jQuery);
        </script>

    <?php } ?>
3
stemie

これにはWp関数を使うことができます。 wp_delete_user();この機能はユーザーIDで機能します。この方法ですべての購読者のユーザーIDを取得することができます。

$get_subscribers = get_users('role=subscriber');
foreach($get_subscribers as $user){
    wp_delete_user($user->ID);
}
2
Fatih SARI