From 4a725f3f3e69ed0443411ddfb23cb52bb3c75350 Mon Sep 17 00:00:00 2001 From: Tatu <17417945+rekkitatu@users.noreply.github.com> Date: Mon, 13 May 2019 02:14:52 +0300 Subject: [PATCH] Delete guest session after user logs in Logging in to the user account makes a copy of the guest session and possible cart content. This causes conflicts in situations where there are only single quantities of products left and real time product availability checks are in place. While this kind of single quantity items are at time in two carts for the same visitor the checking of product availability fails. Deleting the same visitors guest cart solves this issue. --- includes/class-wc-session-handler.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/includes/class-wc-session-handler.php b/includes/class-wc-session-handler.php index 4d2a8a9e316..8b7751cecdd 100644 --- a/includes/class-wc-session-handler.php +++ b/includes/class-wc-session-handler.php @@ -94,9 +94,10 @@ class WC_Session_Handler extends WC_Session { // If the user logs in, update session. if ( is_user_logged_in() && get_current_user_id() !== $this->_customer_id ) { + $guest_session_id = $this->_customer_id; $this->_customer_id = get_current_user_id(); $this->_dirty = true; - $this->save_data(); + $this->save_data($guest_session_id); $this->set_customer_session_cookie( true ); } @@ -236,7 +237,7 @@ class WC_Session_Handler extends WC_Session { /** * Save data. */ - public function save_data() { + public function save_data($old_session_key = false) { // Dirty if something changed - prevents saving nothing new. if ( $this->_dirty && $this->has_session() ) { global $wpdb; @@ -253,6 +254,9 @@ class WC_Session_Handler extends WC_Session { wp_cache_set( $this->get_cache_prefix() . $this->_customer_id, $this->_data, WC_SESSION_CACHE_GROUP, $this->_session_expiration - time() ); $this->_dirty = false; + if (get_current_user_id() !== $old_session_key) { + $this->delete_session( $old_session_key ); + } } }