В современных проектах на WordPress часто возникает необходимость автоматически удалять неактивных пользователей, чтобы поддерживать базу данных в актуальном состоянии и не захламлять сайт. В этой статье мы подробно разберём, как создать удобную настройку для автоматического удаления пользователей, которые не заходили на сайт длительное время. Мы рассмотрим пример плагина с админской страницей, где можно задать период неактивности, а также реализуем саму логику удаления с помощью WP-Cron.
Почему важно удалять неактивных пользователей
Неактивные пользователи могут негативно влиять на производительность сайта, усложнять администрирование и создавать потенциальные риски безопасности. Особенно на больших сайтах с регистрацией пользователей, где многие аккаунты создавались давно и не используются. Регулярное удаление таких пользователей помогает:
- Снизить нагрузку на базу данных;
- Сократить размер таблиц пользователей и метаданных;
- Уменьшить риски взлома заброшенных аккаунтов;
- Поддерживать актуальность аудитории.
Создание плагина с настройкой периода неактивности
Начнём с создания простого плагина, который добавит в админку страницу настроек с полем для ввода количества дней неактивности, после которого пользователь будет автоматически удалён.
Регистрация страницы настроек
Добавим меню и форму для ввода параметра:
<?php
// Регистрируем страницу настроек
function wpkit_register_inactive_users_settings_page() {
add_options_page(
'Автоудаление неактивных пользователей',
'Автоудаление пользователей',
'manage_options',
'wpkit-inactive-users',
'wpkit_inactive_users_settings_page_html'
);
}
add_action('admin_menu', 'wpkit_register_inactive_users_settings_page');
// Вывод формы настроек
function wpkit_inactive_users_settings_page_html() {
if (!current_user_can('manage_options')) {
return;
}
// Сохранение настроек
if (isset($_POST['wpkit_inactive_days'])) {
check_admin_referer('wpkit_inactive_users_settings');
$days = intval($_POST['wpkit_inactive_days']);
update_option('wpkit_inactive_days', $days);
echo '<div class="updated">Настройки сохранены.</div>';
}
$value = get_option('wpkit_inactive_days', 90);
?>
<div class="wrap">
<h1>Настройка автоудаления неактивных пользователей</h1>
<form method="post" action="">
<?php wp_nonce_field('wpkit_inactive_users_settings'); ?>
<table class="form-table" role="presentation">
<tr>
<th scope="row"><label for="wpkit_inactive_days">Количество дней неактивности</label></th>
<td><input name="wpkit_inactive_days" type="number" id="wpkit_inactive_days" value="<?php echo esc_attr($value); ?>" class="small-text" min="1" /></td>
</tr>
</table>
<input type="submit" class="button button-primary" value="Сохранить" />
</form>
</div>
<?php
}
Логика удаления неактивных пользователей
Для определения неактивности мы будем использовать дату последнего входа пользователя. По умолчанию WordPress не сохраняет эту информацию, поэтому добавим её с помощью хука wp_login. Затем создадим функцию, которая будет находить и удалять пользователей, не заходивших на сайт дольше заданного периода.
Сохранение даты последнего входа
function wpkit_save_last_login($user_login, $user) {
update_user_meta($user->ID, 'wpkit_last_login', current_time('mysql'));
}
add_action('wp_login', 'wpkit_save_last_login', 10, 2);
Функция удаления неактивных пользователей
function wpkit_delete_inactive_users() {
$days = get_option('wpkit_inactive_days', 90);
if (!$days) {
return;
}
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days) . ' days'));
$args = array(
'meta_key' => 'wpkit_last_login',
'meta_value' => $date_threshold,
'meta_compare' => '<',
'fields' => 'ID',
'number' => 100,
'role__not_in' => array('administrator'),
);
$user_query = new WP_User_Query($args);
$users_to_delete = $user_query->get_results();
foreach ($users_to_delete as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
}
Автоматизация через WP-Cron
Чтобы удаление происходило автоматически, добавим планировщик событий, который будет запускать функцию wpkit_delete_inactive_users один раз в сутки.
Добавление события в планировщик
function wpkit_schedule_inactive_users_deletion() {
if (!wp_next_scheduled('wpkit_daily_inactive_users_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpkit_daily_inactive_users_cleanup');
}
}
add_action('wp', 'wpkit_schedule_inactive_users_deletion');
add_action('wpkit_daily_inactive_users_cleanup', 'wpkit_delete_inactive_users');
Удаление события при деактивации плагина
function wpkit_deactivate_plugin() {
$timestamp = wp_next_scheduled('wpkit_daily_inactive_users_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpkit_daily_inactive_users_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpkit_deactivate_plugin');
Дополнительные рекомендации и плагины для мониторинга
Для более продвинутого управления пользователями можно использовать плагины, которые ведут логи активности и помогают анализировать аудиторию. Например, WPRemark позволяет оценивать активность и взаимодействия пользователей, что поможет принимать решения о целесообразности удаления аккаунтов.
Также для повышения безопасности рекомендуется использовать плагины защиты от несанкционированного доступа и ботов, например, WPKit.
Итог
Создание настройки для автоматического удаления неактивных пользователей в WordPress — полезная задача для поддержания здоровья проекта и безопасности. Мы рассмотрели, как добавить админскую страницу для управления периодом неактивности, как сохранять дату последнего входа, как удалять пользователей с помощью WP_User_Query и как автоматизировать процесс через WP-Cron. Такой подход можно адаптировать под свои нужды и интегрировать с другими плагинами.