워드프레스 웹사이트를 회원제로 운영하는 경우 불필요한 데이터베이스를 삭제해야 웹사이트를 깔끔하게 유지할 수 있는데, 그 중에 회원가입을 해놓고, 활동하지 않는 회원들을 정기적으로 삭제하는 것도 하나의 방법이다.
이러한 과정을 하기 위해서는 다양한 플러그인들이 있지만, 필자가 사용해본결과 많은 쿼리를 잡아먹거나 불필요한 기능으로 오히려 웹사이트 속도가 느려지는 경우가 있다.
그래서 간단하게 테마에 함수를 추가하는 것으로 이를 구현할 수 있는데, 이를 위해서는 2가지 단계가 필요하다.
1. 회원들의 마지막 로그인 기록을 데이터베이스에 저장
워드프레스는 기본적으로 회원들의 마지막 로그인 기록을 데이터베이스에 저장하지 않는다. 그래서 별도의 플러그인이나 함수로 이를 저장할 수 있는데, 아래의 함수가 그것이다.
// 사용자가 로그인할 때마다 마지막 로그인 시간을 저장하는 함수
function update_last_login_time($login) {
$user = get_user_by('login', $login);
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'update_last_login_time');
위의 함수를 추가하면 앞으로 wp-usermeta 테이블 속에 last_login이라는 메타데이터로 각 사용자들의 마지막 로그인을 저장한다.
2. 특정 기간동안 미로그인 시 자동삭제하는 함수
1번의 기반으로 last_login 메타데이터를 보고 자동으로 1년 이상 미 로그인한 사람의 경우 자동 삭제하는 함수는 아래와 같다.
// 1년 동안 로그인하지 않은 사용자를 삭제하는 함수
function delete_inactive_users() {
$one_year_ago = date('Y-m-d H:i:s', strtotime('-1 year'));
// 1년 이상 로그인하지 않은 사용자들을 가져옵니다.
$args = array(
'meta_key' => 'last_login',
'meta_value' => $one_year_ago,
'meta_compare' => '<',
'number' => -1,
);
$users = get_users($args);
// 각 사용자를 삭제합니다.
foreach ($users as $user) {
wp_delete_user($user->ID);
}
}
// 매일 이 함수를 실행하도록 스케줄링합니다.
if (!wp_next_scheduled('delete_inactive_users_daily')) {
wp_schedule_event(time(), 'daily', 'delete_inactive_users_daily');
}
add_action('delete_inactive_users_daily', 'delete_inactive_users');
위의 함수를 통해서 1년이상 미로그인한 사람의 경우는 자동으로 계정이 삭제된다.
3. 사용자 목록에 마지막 로그인 항목 추가
만약 관리자 페이지의 사용자목록에 마지막 로그인 항목을 추가하고 싶다면 아래의 함수를 추가하면 된다.
// 사용자 목록에 '마지막 로그인' 열 추가
function add_last_login_column($columns) {
$columns['last_login'] = '마지막 로그인';
return $columns;
}
add_filter('manage_users_columns', 'add_last_login_column');
// '마지막 로그인' 열에 데이터를 채워주는 함수
function show_last_login_column_data($value, $column_name, $user_id) {
if ('last_login' == $column_name) {
$last_login = get_user_meta($user_id, 'last_login', true);
if ($last_login) {
return date('Y-m-d H:i:s', strtotime($last_login));
} else {
return '기록 없음';
}
}
return $value;
}
add_action('manage_users_custom_column', 'show_last_login_column_data', 10, 3);
// '마지막 로그인' 열을 정렬할 수 있게 함
function make_last_login_sortable($columns) {
$columns['last_login'] = 'last_login';
return $columns;
}
add_filter('manage_users_sortable_columns', 'make_last_login_sortable');
// '마지막 로그인' 열의 정렬 동작 정의
function sort_users_by_last_login($query) {
if (!is_admin()) {
return;
}
$orderby = $query->get('orderby');
if ('last_login' == $orderby) {
$query->set('meta_key', 'last_login');
$query->set('orderby', 'meta_value');
}
}
add_action('pre_get_users', 'sort_users_by_last_login');
위의 함수를 사용하면 된다.
4. 사용자에게 메일 알림
삭제 7일전 사용자에게 삭제 알림의 메일을 보내드록 하고 싶다면 아래의 함수를 사용하면 된다.
// 사용자에게 삭제 알림 이메일 전송
function notify_inactive_users() {
// 현재 날짜와 1년 전 날짜 계산
$current_date = current_time('mysql');
$one_year_ago = date('Y-m-d H:i:s', strtotime('-1 year'));
$seven_days_later = date('Y-m-d H:i:s', strtotime('+7 days'));
// 마지막 로그인 날짜가 1년 전인 사용자 찾기
$args = array(
'meta_key' => 'last_login',
'meta_value' => $one_year_ago,
'meta_compare' => '<',
'number' => -1,
);
$users = get_users($args);
foreach ($users as $user) {
$last_login = get_user_meta($user->ID, 'last_login', true);
// 사용자가 마지막 로그인한 날짜가 1년이 지났고, 알림 날짜가 현재 날짜보다 7일 이내인 경우
if ($last_login < $one_year_ago && $last_login > $seven_days_later) {
$to = $user->user_email;
$subject = '계정 삭제 알림';
$message = "안녕하세요, {$user->display_name}님.\n\n" .
"귀하의 계정이 1년 이상 로그인하지 않아 삭제될 예정입니다. " .
"삭제되기 7일 전 미리 알려드립니다.\n\n" .
"계정을 유지하고 싶으시다면 로그인해 주세요.\n\n" .
"감사합니다.";
wp_mail($to, $subject, $message);
}
}
}
// 매일 이 함수를 실행하도록 스케줄링합니다.
if (!wp_next_scheduled('notify_inactive_users_daily')) {
wp_schedule_event(time(), 'daily', 'notify_inactive_users_daily');
}
add_action('notify_inactive_users_daily', 'notify_inactive_users');
반응형
댓글