2020-08-16 20:11:06 +02:00

122 lines
4.7 KiB
PHP

<?php
/** cron hooking function
* deletes users that were prepared last week
* prepares users for deletion next week
* deletes deletion info that is older than DELETION_DELETION_DELAY (months)
*/
function sntg_aud_cron_job(){
delete_prepared_users();
prepare_users_for_deletion();
delete_deletion_entries();
}
/** delete users that were prepared the last time the job ran */
function delete_prepared_users(){
$users = get_users( array( 'fields' => array( 'ID' ) ) );
foreach($users as $user){
$usermeta = get_user_meta ( $user->ID, 'sntg_user_to_be_deleted');
if (sizeof($usermeta) == 1){
write_log("user " . $user->ID . " has to be deleted: " .$usermeta[0]);
delete_user($user->ID);
}
else {
echo var_dump($usermeta);
}
}
}
/** add db entries for non-admin users (wp_user_level < 10)
* that have not been logged in for longer than USER_DELETION_DELAY (->constants.php)
*
*/
function prepare_users_for_deletion(){
//write_log("prepare users for deletion");
$users = get_users( array( 'fields' => array( 'ID' ) ) );
foreach($users as $user){
$wp_user_level = get_user_meta ( $user->ID, 'wp_user_level', true);
$user_object = get_user_by('id', $user->ID);
//only delete non admins
if (($wp_user_level < 10) && ($user_object->user_login != DELETED_USER_NAME )){
$last_login = get_user_meta ($user->ID, 'sntg_last_login', true);
//if no entry exists, create one with date now
if ($last_login == ''){
update_user_meta($user->ID, 'sntg_last_login', time(), true);
}
//otherwise check if it was more then USER_DELETION_DELAY (one year) ago
elseif ( ( (time() - $last_login) / SEC_TO_MONTH) > USER_DELETION_DELAY){
update_user_meta($user->ID, 'sntg_user_to_be_deleted', time(), true);
write_log("deletion mail sent: " . send_deletion_warning_mail($user->ID));
write_log($user_object->user_login . " prepared for deletion");
}
}
}
}
/** creates an db entry with info about deletion, reassigns users content to default user (DELETED_USER_NAME -> constants.php) and deletes the user */
function delete_user($old_user_ID){
$reassign_user = get_user_by('login', DELETED_USER_NAME);
$reassign_user_id = $reassign_user->ID;
write_log ("deleting user with id: " . $old_user_ID);
create_deletion_entry($old_user_ID);
require_once(ABSPATH.'wp-admin/includes/user.php');
wp_delete_user($old_user_ID, $reassign_user_id);
}
/** creates a post with info about deleted user */
function create_deletion_entry($user_id){
$user = get_user_by('id', $user_id);
$info = "user id: " . $user_id . "; " .
"email: " . $user->user_email . '; ' .
"username: " . $user->user_login .";";
wp_insert_post(array(
'post_type' => 'sntg_ud_info',
'post_content' => $info,
'post_status' => 'publish'
));
}
/** sends an email (templates/info_mail.php) to user with subject SUBJECT (->constants.php) */
function send_deletion_warning_mail($user_id){
$user = get_user_by('id', $user_id);
add_filter( 'wp_mail_content_type', function( $content_type ) {
return 'text/html';
});
$subject = get_bloginfo ('name') . ': ' . SUBJECT; //set subject in constants.php
ob_start();
include (ABSPATH . 'wp-content/plugins/sntg-automatic-user-deletion/templates/info_mail.php');
$message = ob_get_clean();
wp_mail($user->user_email, $subject, $message);
}
/** after DELETION_DELETION_DELAY, most of the info about deleted users (eg email address)
* has to be deleted as well (DSGVO), but the info that a user was deleted has to be stored*/
function delete_deletion_entries(){
$delay_years = intdiv( DELETION_DELETION_DELAY, 12 );
$delay_months = DELETION_DELETION_DELAY % 12;
$entries_to_delete = get_posts(array(
'post_type' => 'sntg_ud_info',
'numberposts' => '-1',
'date_query' => array(
array(
'before' => array(
'year' => date('Y') - $delay_years,
'month' => date('n') - $delay_months,
),
'inclusive' => true,
)
),
));
foreach ($entries_to_delete as $entry){
$info = "deleted deletion info. post_id: " . $entry->ID . "; " . explode(";", $entry->post_content)[0];
write_log($info);
wp_insert_post(array(
'post_type' => 'sntg_ud_deletion',
'post_content' => $info,
'post_status' => 'publish'
));
wp_delete_post ($entry->ID);
}
}