В работе с WordPress часто возникает необходимость удалить пользователя вместе с его данными — постами, комментариями, метаданными и другими связанными объектами. Однако стандартный функционал WordPress при удалении пользователя предлагает лишь два варианта: удалить все записи пользователя или назначить их другому пользователю. Но что делать, если нужно полностью удалить аккаунт со всеми следами на сайте? В этой статье мы подробно рассмотрим, как реализовать такую задачу с помощью кода и плагинов.
Почему стандартного удаления WordPress бывает недостаточно
При удалении пользователя через админку WordPress вы видите два варианта:
- Удалить все записи пользователя;
- Переназначить записи другому пользователю.
Но при этом пользовательские метаданные, например, пользовательские поля (user meta), комментарии, данные в кастомных таблицах или сторонних плагинах остаются в базе. Это приводит к "мусору" и может негативно влиять на производительность и безопасность.
Чтобы полностью очистить базу от следов пользователя, нужно использовать кастомные решения.
Удаление пользователя со всеми данными через PHP-код
Для полного удаления пользователя со всеми связанными данными можно написать функцию, которая удалит:
- Посты пользователя;
- Комментарии пользователя;
- Метаданные пользователя;
- Пользовательский аккаунт.
Рассмотрим пример такой функции на PHP. Для избежания конфликтов добавим префикс wpdir_ к названию функции.
function wpdir_delete_user_completely($user_id) {
if (!current_user_can('delete_users')) {
return new WP_Error('permission_denied', 'Недостаточно прав для удаления пользователей');
}
// Получаем пользователя
$user = get_userdata($user_id);
if (!$user) {
return new WP_Error('user_not_found', 'Пользователь не найден');
}
// Удаляем все посты пользователя
$args = [
'author' => $user_id,
'post_type' => 'any',
'post_status' => 'any',
'numberposts' => -1
];
$posts = get_posts($args);
foreach ($posts as $post) {
wp_delete_post($post->ID, true); // true — принудительное удаление
}
// Удаляем комментарии пользователя
$comments = get_comments(['user_id' => $user_id, 'status' => 'all']);
foreach ($comments as $comment) {
wp_delete_comment($comment->comment_ID, true);
}
// Удаляем метаданные пользователя
delete_user_meta($user_id, ''); // удаляет все метаданные
// Удаляем самого пользователя
require_once(ABSPATH.'wp-admin/includes/user.php');
wp_delete_user($user_id);
return true;
}Вызывайте эту функцию, передавая ID пользователя, которого хотите полностью удалить. Например:
wpdir_delete_user_completely(123);Обратите внимание, что функция проверяет права текущего пользователя и корректно удаляет связанные с пользователем данные.
Удаление данных из сторонних плагинов и кастомных таблиц
Если на вашем сайте используются плагины, которые хранят пользовательские данные в своих таблицах, приведённый код не удалит их. В таком случае рекомендуем:
- Изучить документацию плагина — многие из них предоставляют функции для удаления данных пользователя.
- Добавить вызовы этих функций в нашу
wpdir_delete_user_completelyили создать отдельные функции удаления. - Если данные хранятся в кастомных таблицах, написать SQL-запросы для удаления записей, связанных с ID пользователя.
Пример удаления данных из кастомной таблицы:
global $wpdb;
$table = $wpdb->prefix . 'custom_user_data';
$wpdb->delete($table, ['user_id' => $user_id]);Использование плагинов для удаления пользователей и их данных
Если не хотите писать код, можно использовать плагины, которые помогают удалять пользователей и их данные комплексно:
- Delete Me — позволяет пользователям самостоятельно удалять свои аккаунты, удаляя при этом данные.
- User Data Removal — расширяет возможности удаления с очисткой метаданных.
- Clearfy Pro — мощный плагин оптимизации от WPSHOP, содержит инструменты для очистки базы, в том числе удаления данных пользователей.
После установки таких плагинов изучите их настройки и убедитесь, что они корректно удаляют все связанные данные.
Практические советы и рекомендации
Удаление пользователя — операция необратимая, поэтому всегда делайте резервные копии базы данных перед массовыми изменениями.
Если вы удаляете пользователя массово, лучше автоматизировать процесс через WP-CLI или скрипты на PHP, используя описанные выше методы.
Помните, что удаление аккаунта может повлиять на статистику, ссылки и SEO сайта, поэтому стоит заранее планировать такие действия.
Советы по безопасности
Всегда проверяйте права пользователя, который инициирует удаление.
Используйте nonce и другие механизмы защиты, если добавляете функционал удаления в публичную часть сайта.
Логируйте действия удаления для последующего аудита.
Пример реализации кнопки удаления в админке
Можно добавить в профиль пользователя кнопку удаления, которая вызовет нашу функцию. Пример кода:
add_action('show_user_profile', 'wpdir_add_delete_button');
add_action('edit_user_profile', 'wpdir_add_delete_button');
function wpdir_add_delete_button($user) {
if (!current_user_can('delete_users')) {
return;
}
?>
<h3>Удалить пользователя</h3>
<form method="post">
<?php wp_nonce_field('wpdir_delete_user_action', 'wpdir_delete_user_nonce'); ?>
<input type="hidden" name="wpdir_delete_user_id" value="<?php echo $user->ID; ?>">
<input type="submit" name="wpdir_delete_user_submit" class="button button-danger" value="Удалить пользователя и все данные" onclick="return confirm('Вы точно хотите удалить этого пользователя со всеми данными?');">
</form>
<?php
}
add_action('admin_init', 'wpdir_handle_user_deletion');
function wpdir_handle_user_deletion() {
if (isset($_POST['wpdir_delete_user_submit'])) {
if (!isset($_POST['wpdir_delete_user_nonce']) || !wp_verify_nonce($_POST['wpdir_delete_user_nonce'], 'wpdir_delete_user_action')) {
wp_die('Ошибка проверки безопасности');
}
$user_id = intval($_POST['wpdir_delete_user_id']);
$result = wpdir_delete_user_completely($user_id);
if (is_wp_error($result)) {
wp_die('Ошибка удаления пользователя: ' . $result->get_error_message());
} else {
wp_redirect(admin_url('users.php?deleted=1'));
exit;
}
}
}Этот пример добавляет форму с кнопкой на страницу профиля пользователя в админке, при нажатии удаляет пользователя со всеми данными.