Șterge toți abonații din wp_users și wp_usermeta câteva mii deodată
Am un site cu 70K de abonați spam și nu am nevoie de niciunul. Așa că trebuie să șterg toți abonații din wp_users și meta-datelor asociate fiecărui utilizator din wp_usermeta folosind o interogare în adminer și/sau phpmyadmin.
Dar pentru a evita căderea serverului, cum pot șterge câteva mii deodată?
Acesta pare a fi query-ul de bază de care am nevoie:
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%'
// dar cum selectez câteva mii deodată?
Dar cum selectez doar câteva mii deodată?

Modul meu preferat de a face ceva de genul acesta nu este prin modificarea bazei de date (care întotdeauna îmi dă motive de îngrijorare că ar putea avea efecte secundare), ci prin utilizarea unui utilitar de linie de comandă.
De exemplu, având o instalare funcțională WP CLI, poți pur și simplu să faci asta:
wp user delete $(wp user list --role=subscriber --field=ID --number=10) --reassign=1
Parametrul reassign
reprezintă ID-ul utilizatorului căruia i se vor realoca conținuturile. Putem folosi "--number" (limita), chiar dacă nu este bine documentat, deoarece WP_User_Query îl acceptă.
Și asta este tot - un utilitar curat, de o singură linie de comandă, pentru a efectua operațiuni de genul acesta.
În acest caz, aș recomanda să încerci mai întâi subinterogarea "wp user list..." pentru a vedea care utilizatori vor fi șterși. După rularea comenzii pe o singură linie, vei vedea informații de genul:
...
Succes: Utilizatorul 123 a fost eliminat de pe https://example.com/.
Succes: Utilizatorul 124 a fost eliminat de pe https://example.com/.
...

Pentru aceasta poți utiliza funcția WordPress wp_delete_user(); această funcție lucrează cu ID-ul utilizatorului. Poți obține toate ID-urile utilizatorilor cu rolul de subscriber în felul următor: get_users() pentru a obține utilizatorii filtrați.
$get_subscribers = get_users('role=subscriber');
foreach($get_subscribers as $user){
wp_delete_user($user->ID);
}

Am avut o problemă similară și după ce am citit această întrebare am creat acest plugin (adaptat pentru întrebarea ta).
Odată instalat, creează un meniu de administrare sub Utilizatori numit Ștergere în Masă a Utilizatorilor. Când accesezi această pagină, aceasta va șterge utilizatorii în loturi, câte 20 deodată conform interogării tale SQL (interogarea mea originală era ușor diferită).
Poți ajusta dimensiunea loturilor să fie mai mică sau mai mare, dar această abordare îți permite să ștergi mulți utilizatori fără timeout de server, poate dura câteva minute pentru un număr mare de înregistrări spam.
Folosește jQuery pentru a reîncărca pagina după fiecare lot procesat (aceasta ar putea fi făcută cu AJAX, presupun, dar aveam nevoie de o soluție rapidă).
Poate că altcineva va găsi acest lucru util, cel mai probabil va trebui să adaptezi interogarea SQL pentru situația ta specifică.
<?php
/*
Plugin Name: Ștergere în Masă a Utilizatorilor Spam
Description: Șterge înregistrările 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('Ștergere în Masă a Utilizatorilor', 'Ștergere în Masă a Utilizatorilor', '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>Conținutul orfan va fi reatribuit la:</strong><br />';
echo 'Nume de utilizator: ' . $current_user->user_login . '<br />';
echo 'ID Utilizator: ' . $current_user->ID . '<br />';
<h3>se șterg în prezent...</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 } ?>

Nu pot activa acest plugin. Aveți o eroare în cod, lipsește echo în jurul <h3>currently deleting...</h3>

posibil cu limitare în cazul loturilor mari sau al resurselor 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
