options WHERE option_name LIKE '_wp_session_expires_%'"; /** * Filter the query in case tables are non-standard. * * @param string $query Database count query */ $query = apply_filters( 'wp_session_count_query', $query ); $sessions = $wpdb->get_var( $query ); return absint( $sessions ); } /** * Create a new, random session in the database. * * @param null|string $date */ public static function create_dummy_session( $date = null ) { // Generate our date $time = null !== $date ? strtotime( $date ) : false; $time = strtotime( $date ); // If null was passed, or if the string parsing failed, fall back on a default if ( false === $time ) { /** * Filter the expiration of the session in the database * * @param int */ $expires = time() + (int)apply_filters( 'wp_session_expiration', 30 * 60 ); } else { $expires = date( 'U', strtotime( $date ) ); } $session_id = self::generate_id(); // Store the session add_option( "_wp_session_{$session_id}", array(), '', 'no' ); add_option( "_wp_session_expires_{$session_id}", $expires, '', 'no' ); } /** * Delete old sessions from the database. * * @param int $limit Maximum number of sessions to delete. * * @global wpdb $wpdb * * @return int Sessions deleted. */ public static function delete_old_sessions( $limit = 2000 ) { global $wpdb; $limit = absint( $limit ); $keys = $wpdb->get_results( $wpdb->prepare( "SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE %s ORDER BY option_value ASC LIMIT 0, %d", '_wp_session_expires_%', $limit ) ); $now = time(); $expired = array(); $count = 0; if ($keys != NULL) { //info: as PHP warnings are thrown otherwise foreach( $keys as $expiration ) { $key = $expiration->option_name; $expires = $expiration->option_value; if ( $now > $expires ) { $session_id = addslashes( substr( $key, 20 ) ); $expired[] = $key; $expired[] = "_wp_session_{$session_id}"; $count += 1; } } } // Delete expired sessions if ( ! empty( $expired ) ) { $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name IN ('".implode( "','", $expired )."')" ); } return $count; } /** * Remove all sessions from the database, regardless of expiration. * * @global wpdb $wpdb * * @return int Sessions deleted */ public static function delete_all_sessions() { global $wpdb; $count = $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_wp_session_%'" ); return (int) ( $count / 2 ); } /** * Generate a new, random session ID. * * @return string */ public static function generate_id() { require_once( ABSPATH . 'wp-includes/class-phpass.php' ); $hash = new PasswordHash( 8, false ); return md5( $hash->get_random_bytes( 32 ) ); } }