web-dev-qa-db-fra.com

Supprimer tous les abonnés de wp_users et wp_usermeta plusieurs milliers à la fois

J'ai un site avec 70 000 abonnés de spam et je n'en ai besoin d'aucun. J'ai donc besoin de supprimer tous les abonnés de wp_users et la méta associée de chaque utilisateur de wp_usermeta en utilisant une requête dans adminer et/ou phpmyadmin.

Mais pour ne pas planter le serveur, comment puis-je supprimer plusieurs milliers à la fois?

Cela semble être la requête de base dont j'ai besoin:

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?

Mais comment puis-je sélectionner quelques milliers à la fois?

2
markratledge

Ma manière préférée de faire quelque chose comme cela ne se fait pas via le piratage de base de données (ce qui me préoccupe toujours aura des effets secondaires), mais via un outil en ligne de commande.

Par exemple, en donnant un WP installation CLI fonctionnel , vous pouvez le faire simplement:

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

Le paramètre reassign est l'ID utilisateur de l'utilisateur auquel réaffecter le contenu. Nous pouvons utiliser "--number" (la limite), même si il n'est pas bien documenté , car WP_User_Query le prend en charge.

Voilà, vous avez un utilitaire de ligne de commande en ligne simple pour effectuer des opérations comme celle-ci.

Je vous recommande dans ce cas d'essayer d'abord la sous-requête "liste d'utilisateurs wp .." pour voir quels utilisateurs elle va supprimer. Après avoir exécuté one-liner, vous verrez des informations comme celle-ci:

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

3
ryanm

J'ai eu un problème similaire et après avoir lu cette question, j'ai créé ce plugin (adapté à votre question).

Une fois installé, il crée un menu admin sous Utilisateurs appelé Suppression en bloc d'utilisateurs lorsque vous accédez à cette page, il supprime les utilisateurs par lots, 20 à la fois, selon votre requête SQL (my requête originale était légèrement différente).

Vous pouvez rendre les lots plus petits ou plus gros, mais cela vous permet de supprimer de nombreux utilisateurs sans délai d'attente du serveur. Cela peut prendre quelques minutes pour de nombreuses inscriptions au spam.

Il utilise jQuery pour recharger la page après le traitement de chaque lot (cela pourrait être fait avec ajax je suppose mais j'ai besoin de quelque chose rapidement).

Peut-être que quelqu'un d'autre trouvera cela utile, vous aurez probablement besoin d'adapter la requête SQL à votre situation.

    <?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

Vous pouvez utiliser la fonction Wp pour cela. wp_delete_user (); cette fonction fonctionne avec l'identifiant de l'utilisateur. vous pouvez obtenir tous les identifiants utilisateur de cette manière: get_users () récupère vos utilisateurs filtrés.

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