Session()
Description #
AnsPress session handler for managing custom session for logged in and non logged in users.
Source #
File: includes/class/class-session.php
class Session { /** * Instance. * * @var Instance */ protected static $instance = null; /** * Cookie and session name. * * @var string */ private $name = 'anspress_session'; /** * The cookie path. * * @var string */ private $cookie_path = COOKIEPATH; /** * The cookie domain. * * @var string|null */ private $cookie_domain = null; /** * When will cookie and session will expire. * * @var string */ private $expires = DAY_IN_SECONDS; /** * The session ID. * * @var string */ private $id; /** * Get current instance. * * @return AnsPress\Session */ public static function init() { // Create an object. if ( null === self::$instance ) { self::$instance = new self(); } return self::$instance; // Return the object. } /** * Initialize the class. */ public function __construct() { if ( isset( $_COOKIE[ $this->name ] ) ) { $this->id = stripslashes( ap_sanitize_unslash( $_COOKIE[ $this->name ] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput } else { $this->id = $this->generate_id(); $this->set_cookie(); } } /** * Set the session cookie. */ protected function set_cookie() { if ( ! headers_sent() ) { setcookie( $this->name, $this->id, time() + $this->expires, $this->cookie_path, $this->cookie_domain ); } } /** * Delete session cookie. * * @return void */ protected function delete_cookie() { if ( ! headers_sent() ) { setcookie( $this->name, '', time() - 42000, $this->cookie_path, $this->cookie_domain ); } } /** * Generate a cryptographically strong unique ID for the session token. * * @return string */ protected function generate_id() { if ( ! class_exists( 'PasswordHash' ) ) { require_once ABSPATH . 'wp-includes/class-phpass.php'; } $hasher = new \PasswordHash( 8, false ); return md5( $hasher->get_random_bytes( 32 ) ); } /** * Get an offset by from AnsPress session. * * @param string $key Offset key. * @return mixed * @since 4.1.5 */ public function get( $key ) { $cache = get_transient( 'anspress_session_' . $this->id ); if ( false === $cache ) { return; } if ( isset( $cache[ $key ] ) ) { return $cache[ $key ]; } } /** * Set offset in AnsPress session. * * @param string $key Offset key. * @param mixed|null $val Offset value. Delete key value pair if this is `null`. * @return void * @since 4.1.5 */ public function set( $key, $val = null ) { $cache = get_transient( 'anspress_session_' . $this->id ); if ( false === $cache ) { $cache = array( $key => $val ); } $cache[ $key ] = $val; set_transient( 'anspress_session_' . $this->id, $cache, $this->expires ); } /** * Set a question id in session's questions offset. * * @param integer $id Question id. * @return void * @since 4.1.5 */ public function set_question( $id ) { $questions = $this->get( 'questions' ); if ( ! $questions ) { $questions = array(); } $questions[] = $id; $this->set( 'questions', $questions ); } /** * Set an answer id in session's answers offset. * * @param integer $id Answer id. * @return void * @since 4.1.5 * @since 4.1.7 Fixed: new answers are not being set in session. */ public function set_answer( $id ) { $answers = $this->get( 'answers' ); if ( ! $answers ) { $answers = array(); } $answers[] = $id; $this->set( 'answers', $answers ); } /** * Delete all session data or just a key=>value pair. * * @param null|string $key Name of key. On `null` all session data is deleted. * @return void * @since 4.1.5 */ public function delete( $key = null ) { // Delete all session data if no key set. if ( null === $key ) { delete_transient( 'anspress_session_' . $this->id ); return; } $this->set( $key ); } /** * Check if post is in user's session. * * @param mixed $_post WordPress post object or ID. * @return boolean * @since 4.1.5 */ public function post_in_session( $_post ) { $_post = ap_get_post( $_post ); $session_type = 'answer' === $_post->post_type ? 'answers' : 'questions'; $session_posts = anspress()->session->get( $session_type ); if ( ! empty( $session_posts ) && ! is_user_logged_in() && '0' === $_post->post_author && in_array( (int) $_post->ID, $session_posts, true ) ) { return true; } return false; } /** * Set a file in user's session. * * @param string $filename File name. * @return void * @since 4.1.8 */ public function set_file( $filename ) { $files = $this->get( 'files' ); if ( ! $files ) { $files = array(); } $files[] = $filename; $this->set( 'files', $files ); } }
Expand full source code Collapse full source code View on GitHub: includes/class/class-session.php:22
Add your comment