Eliminare tutti gli iscritti da wp_users e wp_usermeta a migliaia per volta

2 nov 2014, 05:30:02
Visualizzazioni: 15.7K
Voti: 7

Ho un sito con 70K iscritti spam e non ho bisogno di nessuno di questi. Devo quindi eliminare tutti gli iscritti da wp_users e i metadati associati da wp_usermeta utilizzando una query in Adminer e/o phpMyAdmin.

Per evitare di far crashare il server, come posso eliminarli a migliaia per volta?

Sembra che questa sia la query base di cui ho bisogno:

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%'
// ma come faccio a selezionarne solo qualche migliaio alla volta?

Ma come posso selezionarne solo qualche migliaio alla volta?

5
Commenti

Forse la clausola SQL LIMIT? DELETE ... FROM ... INNER JOIN... ON... LIMIT 3000

josh josh
2 nov 2014 06:00:34

Prima di fare questo, assicurati di avere un backup!

SLH SLH
2 nov 2014 14:34:15

Vero; non eliminare il tuo account admin :)

josh josh
3 nov 2014 00:21:04

mysql> delete wp_users, wp_usermeta 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%';

Query OK, 475666 righe modificate (9,26 sec)

è comunque molto veloce anche con migliaia di iscritti :)

strangeman strangeman
10 feb 2016 09:10:48

@strangeman: non necessariamente; tutto dipende dal server, sul quale non avevo alcun controllo, quasi due anni fa.

markratledge markratledge
10 feb 2016 19:41:26
Tutte le risposte alla domanda 5
0

Il mio modo preferito per fare qualcosa del genere non è tramite l'hacking del database (che mi preoccupa sempre possa avere effetti collaterali), ma utilizzando uno strumento da riga di comando.

Ad esempio, avendo un'installazione funzionante di WP CLI, puoi semplicemente eseguire questo comando:

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

Il parametro reassign è l'ID dell'utente a cui riassegnare i contenuti. Possiamo usare "--number" (il limite), anche se non è ben documentato, perché WP_User_Query lo supporta.

Ecco qui - un comando pulito e in una sola riga per eseguire operazioni come questa.

In questo caso, ti consiglio di provare prima la subquery "wp user list..." per vedere quali utenti verranno eliminati. Dopo aver eseguito il comando, vedrai informazioni come queste:

... Success: Utente 123 rimosso da https://example.com/. Success: Utente 124 rimosso da https://example.com/. ...

30 giu 2017 19:15:32
2

Puoi utilizzare la funzione di WordPress per questo. wp_delete_user(); questa funzione lavora con l'ID utente. Puoi ottenere tutti gli ID degli utenti iscritti in questo modo: get_users() per ottenere gli utenti filtrati.

$get_subscribers = get_users('role=subscriber');
foreach($get_subscribers as $user){
    wp_delete_user($user->ID);
}
2 nov 2014 21:21:09
Commenti

probabilmente sarà necessario estendere il limite di tempo di PHP per eliminare effettivamente tutti gli utenti e non interrompersi dopo 30 secondi

Mark Kaplun Mark Kaplun
3 nov 2014 07:07:47

require_once ABSPATH . 'wp-admin/includes/user.php'; deve essere importato

G.F. G.F.
27 set 2020 00:10:47
2

Ho avuto un problema simile e dopo aver letto questa domanda ho creato questo plugin (adattato per la tua domanda).

Una volta installato, crea un menu admin sotto Utenti chiamato Eliminazione Massiva Utenti. Quando accedi a questa pagina, elimina gli utenti in batch, 20 alla volta come nella tua query SQL (la mia query originale era leggermente diversa).

Puoi rendere i batch più piccoli o più grandi, ma questo ti consente di eliminare molti utenti senza timeout del server, potrebbe volerci qualche minuto per molti spam registrati.

Utilizza jQuery per ricaricare la pagina dopo l'elaborazione di ogni batch (questo potrebbe essere fatto con AJAX immagino, ma avevo bisogno di una soluzione rapida).

Forse qualcun altro lo troverà utile, molto probabilmente dovrai adattare la query SQL alla tua situazione.

    <?php 
    /*
    Plugin Name: Bulk Delete Spam Users
    Description: Elimina le registrazioni spam
    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('Eliminazione Massiva Utenti', 'Eliminazione Massiva Utenti', '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>Il contenuto orfano verrà riassegnato a:</strong><br />';
        echo 'Username: ' . $current_user->user_login . '<br />';
        echo 'ID Utente: ' . $current_user->ID . '<br />';

        <h3>eliminazione in corso...</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 } ?>
5 mar 2015 16:46:34
Commenti

Non riesco ad attivare questo plugin. C'è un errore nel tuo codice, manca l'echo attorno al <h3>currently deleting...</h3>

TARKUS TARKUS
3 mag 2022 13:16:32

Dopo aver corretto il codice, attivandolo e avviandolo (si avvia automaticamente senza conferma, attenzione!) in realtà non ha fatto nulla. Forse qualche funzione di WP è cambiata dal 2015.

TARKUS TARKUS
3 mag 2022 13:26:28
0

Penso che tu debba modificare un po' la tua query. "DELETE wp_users FROM wp_users"

DELETE wp_users 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%';
25 lug 2022 18:37:00
0

possibile con limite nel caso di grandi batch o risorse limitate:

DELETE 
FROM wp_users
WHERE EXISTS
      ( SELECT t2.user_id
        FROM wp_usermeta AS t2
        WHERE t2.user_id = wp_users.ID
          AND t2.meta_key ='wp_capabilities' AND meta_value LIKE '%customer%'
      ) 
ORDER BY ID DESC
LIMIT 10000
4 dic 2022 16:36:18