Ma base de données d'utilisateurs est pleine de robots. Existe-t-il une commande SQL utile pour supprimer tous les utilisateurs ayant a) posté un commentaire marqué comme spam par Akismet ou b) n'ayant jamais posté de commentaire?
Bonjour @ Nick Loman:
Il n'y a pas une commande, mais plusieurs. Veillez toutefois à sauvegarder votre base de données avant de l'exécuter, car il y a une petite chance que quelque chose dans votre base de données diffère de la mienne, en particulier après une mise à niveau .1 au-delà de la version 3.0. Cela risque donc de ne pas fonctionner correctement et de restaurer.
DELETE FROM wp_usermeta WHERE user_id IN (
SELECT user_id FROM wp_comments WHERE user_id<>0 AND comment_approved='spam'
) AND user_id NOT IN (
SELECT DISTINCT user_id FROM wp_comments
);
DELETE FROM wp_users WHERE ID IN (
SELECT user_id FROM wp_comments WHERE user_id<>0 AND comment_approved='spam'
) AND ID NOT IN (
SELECT DISTINCT user_id FROM wp_comments
);
DELETE FROM wp_commentmeta WHERE comment_id IN (
SELECT comment_ID FROM wp_comments WHERE comment_approved='spam'
);
DELETE FROM wp_comments WHERE comment_approved='spam';
Vous voudrez utiliser la fonction wp_delete_user (): http://codex.wordpress.org/Function_Reference/wp_delete_user
Cependant, vous devez d'abord supprimer tous les identifiants d'utilisateur. Je suggère de les obtenir en procédant comme suit (remarque: ce code n'est pas testé):
global $wpdb;
$delete_ids = $wpdb->get_col(
"SELECT
users.ID
FROM
{$wpdb->users} users
LEFT JOIN
{$wpdb->prefix}comments comments ON comments.user_id = users.ID
WHERE 1
AND (
comments.comment_ID IS NULL
OR
comments.comment_approved = 'spam'
)"
);
foreach ($delete_ids as $id) {
wp_delete_user($id);
}
Je suggère d'exécuter la requête manuellement et de vérifier les résultats avant d'effectuer toute suppression. Et bien sûr, sauvegardez votre base de données avant d’apporter des modifications.