Eliminar todos los suscriptores de wp_users y wp_usermeta unos pocos miles a la vez

2

Tengo un sitio con suscriptores de correo no deseado de 70 K, y no necesito ninguno de ellos. Así que necesito eliminar todos los suscriptores de wp_users y los meta asociados de cada usuario de wp_usermeta usando una consulta en el administrador y / o phpmyadmin.

Pero para evitar que el servidor se bloquee, ¿cómo puedo eliminar unos pocos miles a la vez?

Esta parece ser la consulta básica que necesito:

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?

¿Pero cómo selecciono unos pocos miles a la vez?

    
pregunta markratledge 02.11.2014 - 04:30

3 respuestas

3

Tuve un problema similar y, después de leer esta pregunta, hice este complemento (adaptado a tu pregunta).

Una vez instalado, crea un menú de administración en Usuarios llamado Eliminación masiva de usuarios cuando accede a esta página, elimina los usuarios en lotes , 20 a la vez según su consulta de SQL (mi consulta original fue ligeramente diferente).

Puede hacer que los lotes sean más pequeños o más grandes, pero esto le permite eliminar muchos usuarios sin tiempo de espera del servidor, lo que puede demorar unos minutos en realizar una gran cantidad de registros de spam.

Utiliza jquery para recargar la página después de procesar cada lote (esto podría hacerse con ajax, pero necesito algo rápidamente).

Tal vez a alguien más le resulte útil, lo más probable es que necesite adaptar la consulta de SQL a su situación.

    <?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 } ?>
    
respondido por el stemie 05.03.2015 - 15:46
2

Puedes usar la función Wp para esto. wp_delete_user (); Esta función funciona con ID de usuario. puede obtener la identificación de usuario de todos los suscriptores de esta manera: get_users () obteniendo sus usuarios filtrados.

$get_subscribers = get_users('role=subscriber');
foreach($get_subscribers as $user){
    wp_delete_user($user->ID);
}
    
respondido por el Fatih SARI 02.11.2014 - 20:21
2

Mi forma favorita de hacer algo como esto no es a través de la piratería de bases de datos (lo que siempre me preocupa tendrá efectos secundarios), sino a través de una herramienta de línea de comandos.

Por ejemplo, al dar una instalación de CLI de WP en funcionamiento, simplemente puede hacer esto:

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

El parámetro reassign es el ID de usuario del usuario para reasignar contenido. Podemos usar "--number" (el límite), aunque no está bien documentado , porque WP_User_Query lo admite.

Ahí lo tienes, una utilidad de línea de comandos limpia y de una línea para realizar operaciones como esta.

Recomendaría en este caso que pruebe la subconsulta primero "wp user list .." para ver qué usuarios eliminará. Después de ejecutar el one-liner, verá información como esta:

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

    
respondido por el ryanm 30.06.2017 - 18:15

Lea otras preguntas en las etiquetas