class-wcml-xdomain-data.php
79 lines
| 1 | <?php |
| 2 | |
| 3 | class WCML_xDomain_Data implements \IWPML_Backend_Action, \IWPML_Frontend_Action, \IWPML_DIC_Action { |
| 4 | |
| 5 | private $cookie_handler; |
| 6 | |
| 7 | public function __construct( WPML_Cookie $cookie_handler ) { |
| 8 | $this->cookie_handler = $cookie_handler; |
| 9 | } |
| 10 | |
| 11 | public function add_hooks() { |
| 12 | add_filter( 'wpml_cross_domain_language_data', [ $this, 'pass_data_to_domain' ] ); |
| 13 | add_action( 'before_woocommerce_init', [ $this, 'check_request' ] ); |
| 14 | } |
| 15 | |
| 16 | public function pass_data_to_domain( $data ) { |
| 17 | |
| 18 | $wcml_session_id = md5( microtime() . uniqid( (string) mt_rand(), true ) ); |
| 19 | $data['wcsid'] = $wcml_session_id; |
| 20 | $session_data = []; |
| 21 | |
| 22 | if ( isset( $_COOKIE[ 'wp_woocommerce_session_' . COOKIEHASH ] ) ) { |
| 23 | $session_data['session'] = $_COOKIE[ 'wp_woocommerce_session_' . COOKIEHASH ]; |
| 24 | } |
| 25 | |
| 26 | if ( isset( $_COOKIE['woocommerce_cart_hash'] ) ) { |
| 27 | $session_data['hash'] = $_COOKIE['woocommerce_cart_hash']; |
| 28 | $session_data['items'] = $_COOKIE['woocommerce_items_in_cart']; |
| 29 | } |
| 30 | |
| 31 | if ( ! empty( $session_data ) ) { |
| 32 | update_option( 'wcml_session_data_' . $wcml_session_id, $session_data ); |
| 33 | } |
| 34 | |
| 35 | return $data; |
| 36 | } |
| 37 | |
| 38 | public function check_request() { |
| 39 | |
| 40 | if ( has_filter( 'wpml_get_cross_domain_language_data' ) ) { |
| 41 | $xdomain_data = apply_filters( 'wpml_get_cross_domain_language_data', [] ); |
| 42 | } elseif ( isset( $_GET['xdomain_data'] ) ) { |
| 43 | $xdomain_data = json_decode( base64_decode( $_GET['xdomain_data'] ), true ); |
| 44 | } |
| 45 | |
| 46 | if ( isset( $xdomain_data['wcsid'] ) ) { |
| 47 | $this->set_session_data( $xdomain_data['wcsid'] ); |
| 48 | } |
| 49 | |
| 50 | } |
| 51 | |
| 52 | private function set_session_data( $wcml_session_id ) { |
| 53 | |
| 54 | $data = maybe_unserialize( get_option( 'wcml_session_data_' . $wcml_session_id ) ); |
| 55 | |
| 56 | if ( ! empty( $data ) ) { |
| 57 | |
| 58 | $session_expiration = time() + (int) apply_filters( 'wc_session_expiration', 60 * 60 * 48 ); |
| 59 | $secure = apply_filters( 'wc_session_use_secure_cookie', false ); |
| 60 | |
| 61 | if ( isset( $data['session'] ) ) { |
| 62 | $this->cookie_handler->set_cookie( 'wp_woocommerce_session_' . COOKIEHASH, $data['session'], $session_expiration, COOKIEPATH, COOKIE_DOMAIN, $secure ); |
| 63 | $_COOKIE[ 'wp_woocommerce_session_' . COOKIEHASH ] = $data['session']; |
| 64 | } |
| 65 | |
| 66 | if ( isset( $data['hash'] ) ) { |
| 67 | $this->cookie_handler->set_cookie( 'woocommerce_cart_hash', $data['hash'], $session_expiration, COOKIEPATH, COOKIE_DOMAIN, $secure ); |
| 68 | $this->cookie_handler->set_cookie( 'woocommerce_items_in_cart', $data['items'], $session_expiration, COOKIEPATH, COOKIE_DOMAIN, $secure ); |
| 69 | $_COOKIE['woocommerce_cart_hash'] = $data['hash']; |
| 70 | $_COOKIE['woocommerce_items_in_cart'] = $data['items']; |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | delete_option( 'wcml_session_data_' . $wcml_session_id ); |
| 75 | |
| 76 | } |
| 77 | |
| 78 | } |
| 79 |