Eliminare tutti gli iscritti da wp_users e wp_usermeta a migliaia per volta
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?
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/.
...

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);
}

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

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

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
