Set subscriber cookie on signup

[MAILPOET-3924]
This commit is contained in:
Jan Jakes
2021-12-15 13:56:53 +01:00
committed by Veljko V
parent 4ef2d4ed94
commit 1833a11570
4 changed files with 104 additions and 1 deletions

View File

@@ -247,6 +247,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Statistics\Track\Clicks::class); $container->autowire(\MailPoet\Statistics\Track\Clicks::class);
$container->autowire(\MailPoet\Statistics\Track\Opens::class)->setPublic(true); $container->autowire(\MailPoet\Statistics\Track\Opens::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\Track\SubscriberCookie::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\WooCommercePurchases::class);
$container->autowire(\MailPoet\Statistics\Track\Unsubscribes::class)->setPublic(true); $container->autowire(\MailPoet\Statistics\Track\Unsubscribes::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\StatisticsFormsRepository::class)->setPublic(true); $container->autowire(\MailPoet\Statistics\StatisticsFormsRepository::class)->setPublic(true);

View File

@@ -0,0 +1,46 @@
<?php declare(strict_types = 1);
namespace MailPoet\Statistics\Track;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Settings\TrackingConfig;
use MailPoet\Subscribers\SubscribersRepository;
class SubscriberHandler {
/** @var SubscriberCookie */
private $subscriberCookie;
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var TrackingConfig */
private $trackingConfig;
public function __construct(
SubscriberCookie $subscriberCookie,
SubscribersRepository $subscribersRepository,
TrackingConfig $trackingConfig
) {
$this->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);
}
}
}

View File

@@ -3,6 +3,7 @@
namespace MailPoet\Subscription; namespace MailPoet\Subscription;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\Track\SubscriberHandler;
use MailPoet\Subscribers\SubscriberActions; use MailPoet\Subscribers\SubscriberActions;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@@ -17,14 +18,19 @@ class Registration {
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
/** @var SubscriberHandler */
private $subscriberHandler;
public function __construct( public function __construct(
SettingsController $settings, SettingsController $settings,
WPFunctions $wp, WPFunctions $wp,
SubscriberActions $subscriberActions SubscriberActions $subscriberActions,
SubscriberHandler $subscriberHandler
) { ) {
$this->settings = $settings; $this->settings = $settings;
$this->subscriberActions = $subscriberActions; $this->subscriberActions = $subscriberActions;
$this->wp = $wp; $this->wp = $wp;
$this->subscriberHandler = $subscriberHandler;
} }
public function extendForm() { public function extendForm() {
@@ -100,5 +106,8 @@ class Registration {
], ],
$segmentIds $segmentIds
); );
// start subscriber tracking (by email, we don't have WP user ID yet)
$this->subscriberHandler->identifyByEmail($email);
} }
} }

View File

@@ -0,0 +1,47 @@
<?php
namespace MailPoet\Test\Acceptance;
use AcceptanceTester;
use MailPoet\Test\DataFactories\Settings;
use PHPUnit\Framework\Assert;
class SubscriberCookieCest {
private const SUBSCRIBER_COOKIE_NAME = 'mailpoet_subscriber';
public function setSubscriberCookieOnSignup(AcceptanceTester $i) {
$i->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]) ?: ''));
}
}