J’ai eu des milliers de comptes spams enregistrés sur un site WooCommerce, des clients sans commande, et ai du chercher comment supprimer certains comptes clients WordPress en SQL dans PHPMyAdmin, sans supprimer ceux qui avaient passé commande ou qui étaient plus « légitimes ».

La requête SQL suivante sélectionne les utilisateurs qui n’ont pas passé de commande et ne sont pas auteur d’un article (j’écris ça de tête, vérifiez bien avant de lancer la requête finale de suppression ! )

SELECT * from wp_users where wp_users.ID not in (
	SELECT meta_value FROM wp_postmeta WHERE meta_key = '_customer_user'
) AND wp_users.ID not in (
	select distinct(post_author) from wp_posts
)

J’ai remarqué que cela sélectionne des comptes légitimes, qui sont les seuls à avoir une valeur dans la colonne « user_activation_key », et ai donc ajouté :

SELECT * from wp_users where wp_users.ID not in (
	SELECT meta_value FROM wp_postmeta WHERE meta_key = '_customer_user'
) AND wp_users.ID not in (
	select distinct(post_author) from wp_posts
) AND wp_users.user_activation_key = '' 

Puis que les comptes clients utilisateurs spams n’avaient pas de nom :

SELECT * from wp_users where wp_users.ID not in (
	SELECT meta_value FROM wp_postmeta WHERE meta_key = '_customer_user'
) AND wp_users.ID not in (
	SELECT meta_value FROM wp_postmeta WHERE meta_key = 'first_name' AND meta_value = ''
) AND wp_users.ID not in (
	select distinct(post_author) from wp_posts
) AND wp_users.user_activation_key = '' 

Vous pouvez jouer avec ces requêtes SQL qui sélectionnent les clients qui n’ont pas passé de commande ou les utilisateurs spams, et lorsque vous êtes satisfait de votre sélection, après après avoir fait une sauvegarde de votre base de données, lancez la requête en remplacant « SELECT * » par « DELETE », par exemple dans mon cas :

DELETE from wp_users where wp_users.ID not in (
	SELECT meta_value FROM wp_postmeta WHERE meta_key = '_customer_user'
) AND wp_users.ID not in (
	SELECT meta_value FROM wp_postmeta WHERE meta_key = 'first_name' AND meta_value = ''
) AND wp_users.ID not in (
	select distinct(post_author) from wp_posts
) AND wp_users.user_activation_key = '' 

Ensuite, il faut nettoyer les données dans wp_usermeta pour les utilisateurs qui n’existent plus :

delete from wp_usermeta where wp_usermeta.user_id not in (select ID from wp_users);

Puis faire de même dans la table wp_wc_customer_lookup :

delete from wp_wc_customer_lookup where wp_wc_customer_lookup.user_id not in (select ID from wp_users);

Après, je ne sais plus pourquoi, mais j’ai supprimé les sessions comme ci :

DELETE FROM wp_options
WHERE option_name LIKE '_wc_session_%' OR option_name LIKE '_wc_session_expires_%'

Miracle, les utilisateurs ont bien disparu du menu « Comptes / Utilisateurs ».

Mais ils sont encore affichés dans WooCommerce > Clients !

Après de longues recherches … j’ai trouvé qu’il s’agit simplement d’un cache WordPress WooCommerce, qu’on vide en allant dans WooCommerce > Status > Tools, et en cliquant sur les boutons « Clear WooCommerce transients » et « Clear cache » qui s’y trouvent.

Si cela vous a aidé et vous a économisé des heures de recherches, laissez un commentaire d’appréciation ci-dessous et jetez un oeil à mes formations Web.