Как удалить все сохранённые данные пользователя в WordPress

В процессе работы с WordPress часто возникает необходимость полностью удалить все данные конкретного пользователя. Это может быть связано с требованиями законодательства о защите персональных данных (например, GDPR), необходимостью очистить базу или просто удалить неактивных пользователей вместе с их контентом.

Почему просто удалить пользователя недостаточно: что сохраняется в базе данных

Когда вы удаляете пользователя в стандартном интерфейсе WordPress, система предлагает два варианта: удалить контент пользователя или передать его другому пользователю. Но при этом множество связанных данных остаются в базе:

  • Пользовательские метаданные (wp_usermeta).
  • Комментарии, оставленные пользователем (wp_comments и wp_commentmeta).
  • Посты, если выбрана передача, остаются, но если удалять, они удаляются.
  • Данные плагинов, связанные с пользователем.

Если ваша задача — полное удаление всех данных, нужно действовать глубже, чем стандартный функционал WordPress.

Как удалить все данные пользователя через плагины

Существуют плагины, которые помогают полностью удалить пользователя и связанные с ним данные. Вот несколько популярных и проверенных вариантов:

1. WP User Delete

Плагин позволяет пользователям самостоятельно удалять свои аккаунты, при этом удаляются связанные метаданные и контент.

2. Delete Me

Подходит для сайтов с регистрацией пользователей, даёт возможность пользователям удалять свои профили, очищая от данных.

3. Advanced Database Cleaner

Позволяет искать и удалять устаревшие или «мусорные» данные, связанные с удалёнными пользователями.

Однако использование плагинов не всегда даёт 100% результат, особенно если используются сторонние плагины с кастомными таблицами и данными.

Удаление всех пользовательских данных с помощью собственного кода

Для полного контроля лучше написать собственный скрипт. Рассмотрим пример функции wporg_ru_delete_user_and_all_data, которая удаляет пользователя и все связанные с ним данные.

Алгоритм такой:

  • Удаляем метаданные пользователя из wp_usermeta.
  • Удаляем комментарии пользователя и их метаданные.
  • Удаляем посты пользователя (публикации, страницы, кастомные типы).
  • Удаляем самого пользователя из wp_users.
function wporg_ru_delete_user_and_all_data($user_id) {
    if (!get_userdata($user_id)) {
        return new WP_Error('user_not_found', 'Пользователь не найден');
    }

    global $wpdb;

    // Удаляем метаданные пользователя
    $wpdb->delete($wpdb->usermeta, array('user_id' => $user_id));

    // Удаляем комментарии пользователя
    $comments = get_comments(array('user_id' => $user_id, 'status' => 'all', 'number' => 0));
    foreach ($comments as $comment) {
        wp_delete_comment($comment->comment_ID, true);
    }

    // Удаляем все посты пользователя
    $args = array(
        'author' => $user_id,
        'posts_per_page' => -1,
        'post_type' => 'any',
        'post_status' => 'any'
    );
    $user_posts = get_posts($args);
    foreach ($user_posts as $post) {
        wp_delete_post($post->ID, true);
    }

    // Удаляем пользователя
    require_once(ABSPATH.'wp-admin/includes/user.php');
    wp_delete_user($user_id);

    return true;
}

Эту функцию можно вызывать, передавая ID пользователя, которого нужно полностью удалить вместе с данными.

Особенности удаления данных в мультисайтовой сети WordPress

Если у вас сеть сайтов (multisite), задача усложняется, так как пользователь может иметь данные на разных сайтах. В этом случае нужно:

  • Циклом пройти по всем сайтам сети.
  • Для каждого сайта удалить контент и данные пользователя.
  • Выполнить удаление пользователя из всей сети.

Пример кода для удаления пользователя из multisite вместе с данными:

function wporg_ru_delete_user_multisite($user_id) {
    if (!is_multisite()) {
        return wporg_ru_delete_user_and_all_data($user_id);
    }

    global $wpdb;
    $blogs = get_blogs_of_user($user_id);

    foreach ($blogs as $blog) {
        switch_to_blog($blog->userblog_id);

        // Удаляем посты на каждом сайте
        $args = array(
            'author' => $user_id,
            'posts_per_page' => -1,
            'post_type' => 'any',
            'post_status' => 'any'
        );
        $user_posts = get_posts($args);
        foreach ($user_posts as $post) {
            wp_delete_post($post->ID, true);
        }

        // Удаляем комментарии
        $comments = get_comments(array('user_id' => $user_id, 'status' => 'all', 'number' => 0));
        foreach ($comments as $comment) {
            wp_delete_comment($comment->comment_ID, true);
        }

        restore_current_blog();
    }

    // Удаляем метаданные и пользователя из сети
    $wpdb->delete($wpdb->usermeta, array('user_id' => $user_id));
    require_once(ABSPATH.'wp-admin/includes/user.php');
    wp_delete_user($user_id);

    return true;
}

Рекомендации по безопасности и резервному копированию

Удаление данных — необратимый процесс, особенно если речь идёт о полном удалении пользователя и связанного контента. Вот несколько советов:

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

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

Скачать WP с оф. сайта Магазин проверенных платных тем