web-dev-qa-db-fra.com

Comment puis-je supprimer tous les utilisateurs qui n'ont jamais commenté/posté de commentaires spam?

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?

1
user3211

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'; 
2
MikeSchinkel

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.

1
Jon