diff --git a/lib/Statistics/Track/SubscriberCookie.php b/lib/Statistics/Track/SubscriberCookie.php index c0db649df2..a0c1c704c0 100644 --- a/lib/Statistics/Track/SubscriberCookie.php +++ b/lib/Statistics/Track/SubscriberCookie.php @@ -5,7 +5,8 @@ namespace MailPoet\Statistics\Track; use MailPoet\Util\Cookies; class SubscriberCookie { - const COOKIE_NAME = 'mailpoet_abandoned_cart_tracking'; + const COOKIE_NAME = 'mailpoet_subscriber'; + const COOKIE_NAME_LEGACY = 'mailpoet_abandoned_cart_tracking'; const COOKIE_EXPIRY = 10 * 365 * 24 * 60 * 60; // 10 years (~ no expiry) /** @var Cookies */ @@ -18,10 +19,18 @@ class SubscriberCookie { } public function getSubscriberId(): ?int { - $data = $this->cookies->get(self::COOKIE_NAME); - return is_array($data) && $data['subscriber_id'] - ? (int)$data['subscriber_id'] - : null; + $subscriberId = $this->getSubscriberIdFromCookie(self::COOKIE_NAME); + if ($subscriberId) { + return $subscriberId; + } + + $subscriberId = $this->getSubscriberIdFromCookie(self::COOKIE_NAME_LEGACY); + if ($subscriberId) { + $this->setSubscriberId($subscriberId); + $this->cookies->delete(self::COOKIE_NAME_LEGACY); + return $subscriberId; + } + return null; } public function setSubscriberId(int $subscriberId): void { @@ -34,4 +43,11 @@ class SubscriberCookie { ] ); } + + private function getSubscriberIdFromCookie(string $cookieName): ?int { + $data = $this->cookies->get($cookieName); + return is_array($data) && $data['subscriber_id'] + ? (int)$data['subscriber_id'] + : null; + } } diff --git a/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartPageVisitTrackerTest.php b/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartPageVisitTrackerTest.php index ee07a93cbc..8e28e318da 100644 --- a/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartPageVisitTrackerTest.php +++ b/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartPageVisitTrackerTest.php @@ -2,6 +2,7 @@ namespace MailPoet\AutomaticEmails\WooCommerce\Events; +use Codeception\Stub; use MailPoet\Statistics\Track\SubscriberCookie; use MailPoet\Util\Cookies; use MailPoet\WooCommerce\Helper as WooCommerceHelper; @@ -78,7 +79,7 @@ class AbandonedCartPageVisitTrackerTest extends \MailPoetTest { $this->wp->method('wpGetCurrentUser')->willReturn( $this->makeEmpty(WP_User::class, ['exists' => false]) ); - $_COOKIE['mailpoet_abandoned_cart_tracking'] = json_encode(['subscriber_id' => '123']); + $_COOKIE['mailpoet_subscriber'] = json_encode(['subscriber_id' => '123']); $hourAgoTimestamp = $this->currentTime->getTimestamp() - 60 * 60; $this->sessionStore['mailpoet_last_visit_timestamp'] = $hourAgoTimestamp; @@ -86,6 +87,32 @@ class AbandonedCartPageVisitTrackerTest extends \MailPoetTest { expect($this->sessionStore['mailpoet_last_visit_timestamp'])->same($this->currentTime->getTimestamp()); } + public function testItTracksByLegacyCookie() { + $this->wp->method('isAdmin')->willReturn(false); + $this->wp->method('wpGetCurrentUser')->willReturn( + $this->makeEmpty(WP_User::class, ['exists' => false]) + ); + + $cookiesMock = $this->createMock(Cookies::class); + $cookiesMock->method('get')->willReturnCallback(function (string $name) { + if ($name === 'mailpoet_abandoned_cart_tracking') { + return ['subscriber_id' => '123']; + } + return null; + }); + $cookiesMock->expects($this->once())->method('set')->with('mailpoet_subscriber', ['subscriber_id' => '123']); + $cookiesMock->expects($this->once())->method('delete')->with('mailpoet_abandoned_cart_tracking'); + + $pageVisitTracker = Stub::copy($this->pageVisitTracker, [ + 'subscriberCookie' => new SubscriberCookie($cookiesMock), + ]); + + $hourAgoTimestamp = $this->currentTime->getTimestamp() - 60 * 60; + $this->sessionStore['mailpoet_last_visit_timestamp'] = $hourAgoTimestamp; + $pageVisitTracker->trackVisit(); + expect($this->sessionStore['mailpoet_last_visit_timestamp'])->same($this->currentTime->getTimestamp()); + } + public function testItDoesNotTrackWhenUserNotFound() { $this->wp->method('isAdmin')->willReturn(false); $this->wp->method('wpGetCurrentUser')->willReturn( diff --git a/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php b/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php index f8af65e64d..03f1bc8137 100644 --- a/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php +++ b/tests/integration/AutomaticEmails/WooCommerce/Events/AbandonedCartTest.php @@ -144,7 +144,7 @@ class AbandonedCartTest extends \MailPoetTest { ]) ); - $_COOKIE['mailpoet_abandoned_cart_tracking'] = json_encode([ + $_COOKIE['mailpoet_subscriber'] = json_encode([ 'subscriber_id' => $subscriber->id, ]);