Șterge toți abonații din wp_users și wp_usermeta câteva mii deodată

2 nov. 2014, 05:30:02
Vizualizări: 15.7K
Voturi: 7

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

5
Comentarii

Poate clauza SQL LIMIT? DELETE ... FROM ... INNER JOIN... ON... LIMIT 3000

josh josh
2 nov. 2014 06:00:34

Înainte de a face asta, asigură-te că ai o copie de rezervă!

SLH SLH
2 nov. 2014 14:34:15

Corect; nu șterge contul tău de 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 rânduri afectate (9,26 sec)

este foarte rapid chiar și cu mii de abonați, oricum :)

strangeman strangeman
10 feb. 2016 09:10:48

@strangeman: nu neapărat; totul depinde de server, asupra căruia nu aveam control, acum aproape doi ani.

markratledge markratledge
10 feb. 2016 19:41:26
Toate răspunsurile la întrebare 5
0

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/. ...

30 iun. 2017 19:15:32
2

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);
}
2 nov. 2014 21:21:09
Comentarii

probabil va trebui să extinzi limita de timp din php pentru a șterge efectiv toți utilizatorii și nu să se oprească după 30 de secunde

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

require_once ABSPATH . 'wp-admin/includes/user.php'; trebuie importat

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

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 } ?>
5 mar. 2015 16:46:34
Comentarii

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

TARKUS TARKUS
3 mai 2022 13:16:32

După ce am remediat codul, l-am activat și am rulat (se execută automat fără confirmare, atenție!), de fapt nu a făcut nimic. Poate o funcție WP s-a schimbat din 2015.

TARKUS TARKUS
3 mai 2022 13:26:28
0

Cred că trebuie să modifici puțin interogarea ta. "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 iul. 2022 18:37:00
0

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
4 dec. 2022 16:36:18