179 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * WordPress session management.
 | |
|  *
 | |
|  * Standardizes WordPress session data and uses either database transients or
 | |
|  * in-memory caching for storing user session information.
 | |
|  *
 | |
|  * @package WordPress
 | |
|  * @subpackage Session
 | |
|  * @since   3.7.0
 | |
|  */
 | |
| 
 | |
| // Exit if accessed directly
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * Return the current cache expire setting.
 | |
|  *
 | |
|  * @return int
 | |
|  */
 | |
| function wp_session_cache_expire() {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 
 | |
| 	return $wp_session->cache_expiration();
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Alias of wp_session_write_close()
 | |
|  */
 | |
| function wp_session_commit() {
 | |
| 	wp_session_write_close();
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Load a JSON-encoded string into the current session.
 | |
|  *
 | |
|  * @param string $data
 | |
|  */
 | |
| function wp_session_decode( $data ) {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 
 | |
| 	return $wp_session->json_in( $data );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Encode the current session's data as a JSON string.
 | |
|  *
 | |
|  * @return string
 | |
|  */
 | |
| function wp_session_encode() {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 
 | |
| 	return $wp_session->json_out();
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Regenerate the session ID.
 | |
|  *
 | |
|  * @param bool $delete_old_session
 | |
|  *
 | |
|  * @return bool
 | |
|  */
 | |
| function wp_session_regenerate_id( $delete_old_session = false ) {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 
 | |
| 	$wp_session->regenerate_id( $delete_old_session );
 | |
| 
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Start new or resume existing session.
 | |
|  *
 | |
|  * Resumes an existing session based on a value sent by the _wp_session cookie.
 | |
|  *
 | |
|  * @return bool
 | |
|  */
 | |
| function wp_session_start() {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 	do_action( 'wp_session_start' );
 | |
| 
 | |
| 	return $wp_session->session_started();
 | |
| }
 | |
| add_action( 'plugins_loaded', 'wp_session_start' );
 | |
| 
 | |
| /**
 | |
|  * Return the current session status.
 | |
|  *
 | |
|  * @return int
 | |
|  */
 | |
| function wp_session_status() {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 
 | |
| 	if ( $wp_session->session_started() ) {
 | |
| 		return PHP_SESSION_ACTIVE;
 | |
| 	}
 | |
| 
 | |
| 	return PHP_SESSION_NONE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Unset all session variables.
 | |
|  */
 | |
| function wp_session_unset() {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 
 | |
| 	$wp_session->reset();
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Write session data and end session
 | |
|  */
 | |
| function wp_session_write_close() {
 | |
| 	$wp_session = WP_Session::get_instance();
 | |
| 
 | |
| 	$wp_session->write_data();
 | |
| 	do_action( 'wp_session_commit' );
 | |
| }
 | |
| add_action( 'shutdown', 'wp_session_write_close' );
 | |
| 
 | |
| /**
 | |
|  * Clean up expired sessions by removing data and their expiration entries from
 | |
|  * the WordPress options table.
 | |
|  *
 | |
|  * This method should never be called directly and should instead be triggered as part
 | |
|  * of a scheduled task or cron job.
 | |
|  */
 | |
| function wp_session_cleanup() {
 | |
| 	global $wpdb;
 | |
| 
 | |
| 	if ( defined( 'WP_SETUP_CONFIG' ) ) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if ( ! defined( 'WP_INSTALLING' ) ) {
 | |
| 		$expiration_keys = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE '_wp_session_expires_%'" );
 | |
| 
 | |
| 		$now = current_time( 'timestamp' );
 | |
| 		$expired_sessions = array();
 | |
| 
 | |
| 		foreach( $expiration_keys as $expiration ) {
 | |
| 
 | |
| 			// If the session has expired
 | |
| 			if ( $now > intval( $expiration->option_value ) ) {
 | |
| 
 | |
| 				// Get the session ID by parsing the option_name
 | |
| 				$session_id = substr( $expiration->option_name, 20 );
 | |
| 
 | |
| 				if( (int) -1 === (int) $session_id || ! preg_match( '/^[a-f0-9]{32}$/', $session_id ) ) {
 | |
| 					continue;
 | |
| 				}
 | |
| 
 | |
| 				$expired_sessions[] = $expiration->option_name;
 | |
| 				$expired_sessions[] = esc_sql( "_wp_session_$session_id" );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Delete all expired sessions in a single query
 | |
| 		if ( ! empty( $expired_sessions ) ) {
 | |
| 			$option_names = implode( "','", $expired_sessions );
 | |
| 			$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name IN ('$option_names')"  );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Allow other plugins to hook in to the garbage collection process.
 | |
| 	do_action( 'wp_session_cleanup' );
 | |
| }
 | |
| add_action( 'wp_session_garbage_collection', 'wp_session_cleanup' );
 | |
| 
 | |
| /**
 | |
|  * Register the garbage collector as a twice daily event.
 | |
|  */
 | |
| function wp_session_register_garbage_collection() {
 | |
| 	if ( ! wp_next_scheduled( 'wp_session_garbage_collection' ) ) {
 | |
| 		wp_schedule_event( current_time( 'timestamp' ), 'twicedaily', 'wp_session_garbage_collection' );
 | |
| 	}
 | |
| }
 | |
| add_action( 'wp', 'wp_session_register_garbage_collection' );
 |