En muchas tiendas online que encuentro existe un problema originado por haber tenido el registro abierto sin mecanismos anti bots durante un tiempo: la existencia de miles (en ocasiones cientos de miles) clientes «fake». Es decir, clientes que se han dado de alta en el sitio, aparecen como clientes, pero realmente son usuarios creados por bots.
Tener por decir algo 100.000 clientes «fake»en tu base de datos de WooCommerce hará que tengas un tamaño de base de datos inútil enorme:
La solución más básica es buscar todos los clientes, iterar por ellos, y borrar los que no tienen pedidos asociados. Puede que algún cliente se te haya dado de alta y no haya comprado, pero será un caso raro y es la única forma rápida de hacerlo.
Se podría hacer todo con un solo SQL usando el _customer_id que guardan en la tabla postmeta los pedidos, pero eso tiene un riesgo. La base de datos de clientes y pedidos de WooCommerce está cambiando así que mejor usar la API de WooCommerce, las funciones que ofrece de forma nativa, para asegurarnos que todo se hace bien. El proceso se hará más lento pero dará seguridad.
Os dejo un código que hace justo esto que os comento:
$args = array( 'role' => 'customer', 'number' => -1, 'fields' => 'ID', ); $users = get_users( $args ); echo "<ul>"; foreach( $users as $user_id ) { $order_count = wc_get_customer_order_count( $user_id ); if ( $order_count === 0 ){ echo "<li>Borrando " . $user_id . "</li>"; wp_delete_user( $user_id, $id_usuario_contenido_destino ); // $id_usuario_contenido_destino guardará el user_id del usuario al que se le copiará todo el contenido del usuario que se está borrando, solo por si acaso alguno tiene contenido de valor } else{ echo "<li>No borro " . $user_id . "</li>"; } echo "</ul>";
Como todo en todo proceso largo de PHP si lo ejecutáis tal cual, probablemente os dará problemas: el proxy os desconectará por falta de respuesta en PHP (errores 502 de nginx por ejemplo), un error 500 de PHP por exceso en el tiempo de ejecución… así que para resolverlo podéis paginar la consulta:
$args = array( 'role' => 'customer', 'number' => -1, 'fields' => 'ID', 'orderby' => 'user_nicename', // parámetros de ordenación para que siempre se ejecute en el mismo orden 'order' => 'ASC', 'number' => 1000, // tamaño del paso 'offset' => 1000 * $paso, // empezando con $paso = 0, irá paso a paso borrando ); $users = get_users( $args );
El resto sigue igual pero si implementáis esto con un formulario, con parámetros o con JS que vaya llamando al proceso dando paso tened en cuenta una cosa:
Pues tienes diferentes formas pero yo así de forma sencilla en un plugin de funciones o en el functions.php de vuestro tema hijo metería el código en una página que créeis o si queréis con una llamada GET que es algo más sucio pero más rápido. Total, esto es una operación de mantenimiento, la hacéis y borráis luego.
El método ese que os digo de un parámetro GET podría ser algo así por ejemplo:
add_action( 'admin_head', function(){ if( !isset( $_GET['borrar_customers_sin_pedido'] ) || empty( $_GET['borrar_customers_sin_pedido'] ) ) return; // aquí el código
Si hacéis una llamada https://misitio.com/wp-admin/?borrar_customers_sin_pedido=si ejecutará este código lo primero.
Nota: Hay una valoración incrustada en esta entrada, por favor, visita esta entrada para valorarla.RedSys aparte de los pagos normales, llamados autorizaciones, acepta una variedad de operaciones: desde autorizaciones…
WooCommerce permite ordenar los productos de una forma nativa, para poder presentar primero los que…
Cada vez que hay una actualización grande del núcleo WordPress, por defecto WordPress te instala…
Una pantalla LCD es una pantalla delgada y hecha de cristal líquido. Se usa en…
De todos los plugins que existen para Gravity Forms, que son numerosos porque la propia…
Un CMS, como WordPress, facilita la creación y gestión de contenido en la web, sin…