-
Erick Hitter authored
Fixes #2
6ca484f4
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
class-activation-deactivation-hooks.php 1.83 KiB
<?php
/**
* Plugin activation hooks to migrate and clean up data.
*
* @package Redis_User_Session_Storage
*/
namespace Redis_User_Session_Storage;
/**
* Class Activation_Deactivation_Hooks.
*/
final class Activation_Deactivation_Hooks {
/**
* Cron hook for usermeta session cleanup.
*
* @var string
*/
private $cron_hook = 'redis_user_session_storage_clean_usermeta_storage';
/**
* Activation_Hooks constructor.
*
* @param string $plugin_file Path to plugin's main file.
*/
public function __construct( $plugin_file ) {
register_activation_hook(
$plugin_file,
array( $this, 'clean_usermeta_storage' )
);
register_deactivation_hook(
$plugin_file,
array( $this, 'clean_redis_storage' )
);
add_action(
$this->cron_hook,
array( $this, 'do_scheduled_cleanup' )
);
}
/**
* Remove all sessions from usermeta on activation.
*
* @return void
*/
public function clean_usermeta_storage() {
wp_schedule_single_event(
time() + 600,
'redis_user_session_storage_clean_usermeta_storage'
);
}
/**
* Remove session data from usermeta using cron to avoid excessive load.
*
* While this could use `WP_User_Meta_Session_Tokens::drop_sessions()`, this
* approach is safer for large sites.
*
* @return void
*/
public function do_scheduled_cleanup() {
global $wpdb;
$this->clean_usermeta_storage();
$key = 'session_tokens';
$count = $wpdb->get_var(
"SELECT COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '$key'"
);
if ( ! $count ) {
wp_clear_scheduled_hook( $this->cron_hook );
}
$wpdb->query(
"DELETE FROM $wpdb->usermeta WHERE meta_key = '$key' LIMIT 500"
);
}
/**
* Remove all sessions from Redis on deactivation.
*
* @return void
*/
public function clean_redis_storage() {
wp_clear_scheduled_hook( $this->cron_hook );
Plugin::drop_sessions();
}
}