woocommerce/classes/class-wc-session-transients...

109 lines
2.7 KiB
PHP
Raw Normal View History

2012-09-07 13:31:57 +00:00
<?php
/**
* Handle data for the current customers session.
* Implements the WC_Session abstract class
2012-09-07 13:31:57 +00:00
*
* @class WC_Session_Transients
2012-12-03 19:19:58 +00:00
* @version 2.0.0
2012-09-07 13:31:57 +00:00
* @package WooCommerce/Classes
* @author WooThemes
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
2012-11-27 16:22:47 +00:00
class WC_Session_Transients extends WC_Session {
2012-09-07 13:31:57 +00:00
/** customer_id */
private $_customer_id;
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
/** cookie name */
private $_cookie;
2012-11-27 16:22:47 +00:00
/** cookie expiration time */
private $_cookie_expires;
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
/**
* Constructor for the session class.
2012-09-07 13:31:57 +00:00
*
* @access public
* @return void
*/
2012-09-07 17:26:13 +00:00
public function __construct() {
parent::__construct();
2012-11-27 16:22:47 +00:00
$this->_cookie = 'wc_session_cookie_' . COOKIEHASH;
2012-11-08 10:22:34 +00:00
$this->_cookie_expiration = apply_filters( 'wc_session_transients_expiration', 172800 ); // 48 hours default
$this->_customer_id = $this->get_customer_id();
$this->_data = maybe_unserialize( get_transient( 'wc_session_' . $this->_customer_id ) );
2012-11-27 16:22:47 +00:00
if ( false === $this->_data )
2012-09-07 13:31:57 +00:00
$this->_data = array();
2012-09-07 17:26:13 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
/**
* get_customer_id function.
2012-11-27 16:22:47 +00:00
*
* @access private
2012-09-07 13:31:57 +00:00
* @return mixed
*/
private function get_customer_id() {
2012-09-21 15:55:09 +00:00
if ( $customer_id = $this->get_session_cookie() ) {
2012-09-07 13:31:57 +00:00
return $customer_id;
2012-09-21 15:55:09 +00:00
} elseif ( is_user_logged_in() ) {
return get_current_user_id();
2012-09-07 13:31:57 +00:00
} else {
return $this->create_customer_id();
}
}
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
/**
* get_session_cookie function.
2012-11-27 16:22:47 +00:00
*
* @access private
2012-09-07 13:31:57 +00:00
* @return mixed
*/
private function get_session_cookie() {
2012-11-27 16:22:47 +00:00
if ( ! isset( $_COOKIE[ $this->_cookie ] ) )
2012-09-07 13:31:57 +00:00
return false;
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
list( $customer_id, $expires, $hash ) = explode( '|', $_COOKIE[ $this->_cookie ] );
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
// Validate hash
$data = $customer_id . $expires;
$rehash = hash_hmac( 'md5', $data, wp_hash( $data ) );
if ( $hash != $rehash )
return false;
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
return $customer_id;
}
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
/**
* Create a unqiue customer ID and store it in a cookie, along with its hashed value and expirey date. Stored for 48hours.
2012-11-27 16:22:47 +00:00
*
* @access private
2012-09-07 13:31:57 +00:00
* @return void
*/
private function create_customer_id() {
2012-09-07 17:26:13 +00:00
$customer_id = wp_generate_password( 32 ); // Ensure this and the transient is < 45 chars. wc_session_ leaves 34.
$expires = time() + $this->_cookie_expiration;
2012-09-07 13:31:57 +00:00
$data = $customer_id . $expires;
$hash = hash_hmac( 'md5', $data, wp_hash( $data ) );
$value = $customer_id . '|' . $expires . '|' . $hash;
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
setcookie( $this->_cookie, $value, $expires, COOKIEPATH, COOKIE_DOMAIN, false, true );
return $customer_id;
}
2012-11-27 16:22:47 +00:00
2012-09-07 13:31:57 +00:00
/**
* save_data function.
2012-11-27 16:22:47 +00:00
*
2012-09-07 13:31:57 +00:00
* @access public
* @return void
*/
public function save_data() {
// Set cart data
set_transient( 'wc_session_' . $this->_customer_id, $this->_data, $this->_cookie_expiration );
2012-09-07 13:31:57 +00:00
}
}