diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 9e89b8a86e..76242f91fa 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -247,6 +247,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Statistics\Track\Clicks::class); $container->autowire(\MailPoet\Statistics\Track\Opens::class)->setPublic(true); $container->autowire(\MailPoet\Statistics\Track\SubscriberCookie::class)->setPublic(true); + $container->autowire(\MailPoet\Statistics\Track\SubscriberHandler::class)->setPublic(true); $container->autowire(\MailPoet\Statistics\Track\WooCommercePurchases::class); $container->autowire(\MailPoet\Statistics\Track\Unsubscribes::class)->setPublic(true); $container->autowire(\MailPoet\Statistics\StatisticsFormsRepository::class)->setPublic(true); diff --git a/lib/Statistics/Track/SubscriberHandler.php b/lib/Statistics/Track/SubscriberHandler.php new file mode 100644 index 0000000000..29deade6c3 --- /dev/null +++ b/lib/Statistics/Track/SubscriberHandler.php @@ -0,0 +1,46 @@ +subscriberCookie = $subscriberCookie; + $this->subscribersRepository = $subscribersRepository; + $this->trackingConfig = $trackingConfig; + } + + public function identifyByEmail(string $email): void { + if (!$this->trackingConfig->isCookieTrackingEnabled()) { + return; + } + + $subscriber = $this->subscribersRepository->findOneBy(['email' => $email]); + if ($subscriber) { + $this->setCookieBySubscriber($subscriber); + } + } + + private function setCookieBySubscriber(SubscriberEntity $subscriber): void { + $subscriberId = $subscriber->getId(); + if ($subscriberId) { + $this->subscriberCookie->setSubscriberId($subscriberId); + } + } +} diff --git a/lib/Subscription/Registration.php b/lib/Subscription/Registration.php index ca30322548..db7c033020 100644 --- a/lib/Subscription/Registration.php +++ b/lib/Subscription/Registration.php @@ -3,6 +3,7 @@ namespace MailPoet\Subscription; use MailPoet\Settings\SettingsController; +use MailPoet\Statistics\Track\SubscriberHandler; use MailPoet\Subscribers\SubscriberActions; use MailPoet\WP\Functions as WPFunctions; @@ -17,14 +18,19 @@ class Registration { /** @var WPFunctions */ private $wp; + /** @var SubscriberHandler */ + private $subscriberHandler; + public function __construct( SettingsController $settings, WPFunctions $wp, - SubscriberActions $subscriberActions + SubscriberActions $subscriberActions, + SubscriberHandler $subscriberHandler ) { $this->settings = $settings; $this->subscriberActions = $subscriberActions; $this->wp = $wp; + $this->subscriberHandler = $subscriberHandler; } public function extendForm() { @@ -100,5 +106,8 @@ class Registration { ], $segmentIds ); + + // start subscriber tracking (by email, we don't have WP user ID yet) + $this->subscriberHandler->identifyByEmail($email); } } diff --git a/tests/acceptance/Subscribers/SubscriberCookieCest.php b/tests/acceptance/Subscribers/SubscriberCookieCest.php new file mode 100644 index 0000000000..f608b17551 --- /dev/null +++ b/tests/acceptance/Subscribers/SubscriberCookieCest.php @@ -0,0 +1,47 @@ +wantTo('Set subscriber cookie on signup'); + + (new Settings())->withSubscribeOnRegisterEnabled(); + $email = 'test-user@example.com'; + + // signup + $i->cantSeeCookie(self::SUBSCRIBER_COOKIE_NAME); + $i->amOnPage('/wp-login.php?action=register'); + $i->waitForElement(['css' => '.registration-form-mailpoet']); + if (!getenv('MULTISITE')) { + $i->fillField(['name' => 'user_login'], 'test-user'); + $i->fillField(['name' => 'user_email'], $email); + $i->checkOption('#mailpoet_subscribe_on_register'); + $i->click('#wp-submit'); + $i->waitForText('Registration complete. Please check your email'); + } else { + $i->fillField(['name' => 'user_name'], 'mu-test-user'); + $i->fillField(['name' => 'user_email'], $email); + $i->scrollTo(['css' => '#mailpoet_subscribe_on_register']); + $i->checkOption('#mailpoet_subscribe_on_register'); + $i->click('Next'); + $i->waitForText('mu-test-user is your new username'); + } + + // subscriber cookie should be set right after signup + $this->checkSubscriberCookie($i, $email); + } + + private function checkSubscriberCookie(AcceptanceTester $i, string $email): void { + $subscriberId = (int)$i->grabFromDatabase(MP_SUBSCRIBERS_TABLE, 'id', ['email' => $email]); + $i->canSeeCookie(self::SUBSCRIBER_COOKIE_NAME); + $cookie = $i->grabCookie(self::SUBSCRIBER_COOKIE_NAME); + Assert::assertEquals($cookie, urlencode(json_encode(['subscriber_id' => $subscriberId]) ?: '')); + } +}