user
  • 0
Гуру

Как я могу удалить всех пользователей, которые никогда не оставляли комментарии и размещали спам-комментарии?

  • 0

Моя пользовательская база данных заполнена файлами robots. Есть ли полезная команда SQL для удаления всех пользователей, которые либо а) разместили комментарий, помеченный Akismet как спам, либо б) никогда не публиковали комментарий?

Share
  1. Привет @Ник Ломан:

    Там не одна команда, а несколько. Будьте осторожны, сделайте резервную копию своей базы данных, прежде чем запускать это, потому что есть крошечный шанс, что что-то в вашей базе данных отличается от моей, особенно после обновления.1 выше 3.0, и поэтому она может работать не идеально, и вам придется восстанавливать.

    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'; 
    
    • 0
  2. Вы захотите использовать функцию wp_delete_user(): http://codex.wordpress.org/Function_Reference/wp_delete_user

    Однако сначала вам нужно удалить все идентификаторы пользователей. Я бы предложил получить их, выполнив что-то вроде следующего (примечание: этот код не тестировался):

    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);
    }
    

    Я бы предложил запустить запрос вручную и выборочно проверить результаты, прежде чем выполнять какие-либо удаления. И, конечно же, сделайте резервную копию вашей базы данных, прежде чем вносить какие-либо изменения.

    • 0

Оставить ответ

You must login to add an answer.