Effacer en bloc les utilisateurs sur Wordpress

Comment se débarrasser des robots spammeurs qui s'inscrivent sur des quantités de blogs pour obtenir un lien retour?

Pour ce faire, un script à mettre en ligne, peut réaliser l'opération: effacer en bloc tous les spams, autrement dit les inscriptions fictive dans le but de placer l'URL de son site sur le blog.

Le script prend la liste des utilisateurs dans la base de données, et efface tous ceux qui n'ont jamais ajouté aucun commentaire.
Pour ce faire, on doit étudier les tables de Wordpress, utilisant une base de données relationnelle, afin de détecter les liens entre les différentes tables et en supprimant un utilisateurs, supprimer les références à cet utilisateurs dans toutes les tables.

Table Wordpress et utilisateurs

La table users:

ID user_login ... user_nicename    
Numéro unique Pseudo de l'utilisateur   Nom affiché    

On recherche dans d'autres tables les références à l'ID ou le login ou le nom de l'utilisateur ou autres données.

La table posts:

  post_author        
  ID de l'utilisateur        

L'identifieur de l'utilisateur apparaît dans la table des billets s'il en a créé un (sur un site collaboratif).

La table comments:

  comment_author ...     user_id
  Nom donné lors du commentaire       ID de l'utilisateur enregistré

La table des commentaires doit être consultée pour savoir un utilisateur y est présent. Elle contient plusieurs informations concernant l'utilisateur prises au moment ou il fait le commentaire, et son ID. Seul ce dernier champ nous intéresse, les utilisateurs dont l'ID est présent dans cette table ne doivent pas être supprimés.

La table usermeta:

  user_id        
  ID de l'utilisateur        

Elle contient les options relatives à un utilisateur et donc son ID.

La table links:

  link_owner        
  ID de l'utilisateur        

C'est la liste des blogrolls pour chaque utilisateur.

La requête SQL

La condition:

- Elle désigne la liste des utilisateurs.
- La compare avec la table des commentaires.
- La compare avec la table des billets.
- Réduit la liste des utilisateurs en éliminant ceux qui ont produit un billet ou un commentaire.
- Elimine l'ID 1 qui est celle de l'administrateur.

L'action:

Pour les utilisateurs sélectionnés.

- Elle efface l'entrée dans la table users.
- Efface les entrées dans la table usermeta.
- Efface les entrées dans la table links.

Pour prendre la liste des utilisateurs

SELECT ID FROM wp_users

Et pour éliminer le numéro 1

SELECT ID FROM wp_users WHERE user_id > 1

Les requêtes complètes

Test préalable

Pour voir d'abord la liste des comptes effacés, utiliser cette commande:

SELECT * FROM $usertable WHERE ID > 1 AND ID NOT IN (SELECT DISTINCT post_author FROM $postable) AND ID NOT IN (SELECT DISTINCT user_id FROM $commentable)

Exemple avec le suffix wp_

SELECT * FROM wp_users WHERE ID > 1 AND ID NOT IN (SELECT DISTINCT post_author FROM wp_posts) AND ID NOT IN (SELECT DISTINCT user_id FROM wp_comments)

Effacement

On remplace SELECT * par DELETE dans les trois tables concernées.

DELETE FROM wp_users WHERE ID > 1 AND ID NOT IN (SELECT DISTINCT post_author FROM wp_posts) AND ID NOT IN (SELECT DISTINCT user_id FROM wp_comments)

Pour la table usermeta on remplace aussi ID par user_id.

DELETE FROM wp_usermeta WHERE user_id > 1 AND user_id NOT IN (SELECT DISTINCT post_author FROM wp_posts) AND user_id NOT IN (SELECT DISTINCT user_id FROM wp_comments)

Pour la table links, on remplace ID par link_owner

DELETE FROM wp_links WHERE link_owner > 1 AND link_owner NOT IN (SELECT DISTINCT post_author FROM wp_posts) AND link_owner NOT IN (SELECT DISTINCT user_id FROM wp_comments)

Limitations

Plugins

Les plugins couramment utilisés ne créent pas de tables et n'ont pas d'impact sur les utilisateurs.
Mais il est possible que des plugins spécialisés dans la gestion des utilisateurs ou des statistiques créent une nouvelle table qui soit liée à la table des utilisateurs. Cela peut être vérifié avec phpMyAdmin.

Comptes multiples

Si l'on crée des comptes multiples pour accéder au site, et qu'ils ne sont pas utilisés pour créer un billet ou un commentaire, ils seront effacés.

Utiliser un script

Plutôt que de passer trois commandes SQL à chaque fois que l'on veut nettoyer la base de données, on va créer un script pour réaliser l'opération, que l'on mettra en ligne.

Code source:

<?php
include("wp-config.php");

$usertable=$table_prefix."users";
$commentable=$table_prefix."comments";
$usermeta=$table_prefix."usermeta";
$postable=$table_prefix."posts";
$linktable=$table_prefix."links";

$db_handler=mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)
or die("MySQL database '".DB_NAME."' not accessible.");

mysql_select_db(DB_NAME, $db_handler)
or die("Enable to select ".DB_NAME." database
\n"); $query1="DELETE FROM $usertable WHERE ID > 1 AND ID NOT IN (SELECT DISTINCT post_author FROM $postable) AND ID NOT IN (SELECT DISTINCT user_id FROM $commentable)"; $query2="DELETE FROM $usermeta WHERE user_id > 1 AND user_id NOT IN (SELECT DISTINCT post_author FROM $postable) AND user_id NOT IN (SELECT DISTINCT user_id FROM $commentable)"; $query3="DELETE FROM $linktable WHERE link_owner > 1 AND link_owner NOT IN (SELECT DISTINCT post_author FROM $postable) AND link_owner NOT IN (SELECT DISTINCT user_id FROM $commentable)"; mysql_query($query1,$db_handler); mysql_query($query2,$db_handler); mysql_query($query3,$db_handler); echo "Done!"; ?>

Pour l'utiliser...

Ce script n'est pas testé avec chaque nouvelle version de Wordpress. Il peut ne pas fonctionner avec une version récente.

  1. Télécharger l'archive et l'extraire dans le répertoire racine du site Wordpress.
  2. Changez si vous voulez le nom du fichier.
  3. Tester le script sur une version locale de votre site. Pour ce faire, voir comment installer Wordpress localement pour obtenir cette version locale.
  4. Faites une sauvegarde de la base de données avec phpMyAdmin ou outil équivalent. La fonction export ne suffit pas.
  5. Dans la barre d'URL d'un navigateur, tapez l'URL du script.