diff --git a/mailpoet/lib/Entities/StatisticsUnsubscribeEntity.php b/mailpoet/lib/Entities/StatisticsUnsubscribeEntity.php index 2f3b2f1eec..af4cf7cc2f 100644 --- a/mailpoet/lib/Entities/StatisticsUnsubscribeEntity.php +++ b/mailpoet/lib/Entities/StatisticsUnsubscribeEntity.php @@ -22,6 +22,9 @@ class StatisticsUnsubscribeEntity { const SOURCE_ORDER_CHECKOUT = 'order_checkout'; const SOURCE_AUTOMATION = 'automation'; + const METHOD_LINK = 'link'; + const METHOD_ONE_CLICK = 'one_click'; + /** * @ORM\ManyToOne(targetEntity="MailPoet\Entities\NewsletterEntity") * @ORM\JoinColumn(name="newsletter_id", referencedColumnName="id") @@ -115,6 +118,13 @@ class StatisticsUnsubscribeEntity { return $this->meta; } + /** + * @param string $method + */ + public function setMethod(string $method) { + $this->method = $method; + } + /** * @return string */ diff --git a/mailpoet/lib/Router/Endpoints/Subscription.php b/mailpoet/lib/Router/Endpoints/Subscription.php index 4ccab529e5..be8b60d0e2 100644 --- a/mailpoet/lib/Router/Endpoints/Subscription.php +++ b/mailpoet/lib/Router/Endpoints/Subscription.php @@ -3,6 +3,7 @@ namespace MailPoet\Router\Endpoints; use MailPoet\Config\AccessControl; +use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Subscription as UserSubscription; use MailPoet\Util\Request; use MailPoet\WP\Functions as WPFunctions; @@ -102,7 +103,7 @@ class Subscription { exit; } else { $subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_UNSUBSCRIBE, $data); - $subscription->unsubscribe(); + $subscription->unsubscribe(StatisticsUnsubscribeEntity::METHOD_LINK); } } @@ -119,6 +120,6 @@ class Subscription { return; } $subscription = $this->initSubscriptionPage(UserSubscription\Pages::ACTION_UNSUBSCRIBE, $data); - $subscription->unsubscribe(); + $subscription->unsubscribe(StatisticsUnsubscribeEntity::METHOD_ONE_CLICK); } } diff --git a/mailpoet/lib/Statistics/Track/Unsubscribes.php b/mailpoet/lib/Statistics/Track/Unsubscribes.php index 9c03ccf297..bdfcd57e3a 100644 --- a/mailpoet/lib/Statistics/Track/Unsubscribes.php +++ b/mailpoet/lib/Statistics/Track/Unsubscribes.php @@ -32,7 +32,13 @@ class Unsubscribes { $this->subscribersRepository = $subscribersRepository; } - public function track(int $subscriberId, string $source, int $queueId = null, string $meta = null) { + public function track( + int $subscriberId, + string $source, + int $queueId = null, + string $meta = null, + string $method = 'unknown' + ) { $queue = null; $statistics = null; if ($queueId) { @@ -65,6 +71,7 @@ class Unsubscribes { $statistics->setMeta($meta); } $statistics->setSource($source); + $statistics->setMethod($method); $this->statisticsUnsubscribesRepository->persist($statistics); $this->statisticsUnsubscribesRepository->flush(); } diff --git a/mailpoet/lib/Subscription/Pages.php b/mailpoet/lib/Subscription/Pages.php index 6d98387b55..fb3782575d 100644 --- a/mailpoet/lib/Subscription/Pages.php +++ b/mailpoet/lib/Subscription/Pages.php @@ -227,7 +227,7 @@ class Pages { } } - public function unsubscribe() { + public function unsubscribe(string $method): void { if ( !$this->isPreview() && ($this->subscriber !== null) @@ -237,7 +237,9 @@ class Pages { $this->unsubscribesTracker->track( (int)$this->subscriber->id, StatisticsUnsubscribeEntity::SOURCE_NEWSLETTER, - (int)$this->data['queueId'] + (int)$this->data['queueId'], + null, + $method ); } $this->subscriber->setStatus(SubscriberEntity::STATUS_UNSUBSCRIBED); diff --git a/mailpoet/tests/integration/Subscription/PagesTest.php b/mailpoet/tests/integration/Subscription/PagesTest.php index 37cfb24c00..33c658bbb1 100644 --- a/mailpoet/tests/integration/Subscription/PagesTest.php +++ b/mailpoet/tests/integration/Subscription/PagesTest.php @@ -164,7 +164,7 @@ class PagesTest extends \MailPoetTest { $this->createSubscriberSegment($segment); $pages = $this->getPages()->init($action = 'unsubscribe', $this->testData); - $pages->unsubscribe(); + $pages->unsubscribe(StatisticsUnsubscribeEntity::METHOD_LINK); $updatedSubscriber = $this->subscribersRepository->findOneById($this->subscriber->getId()); $this->assertInstanceOf(SubscriberEntity::class, $updatedSubscriber); @@ -181,7 +181,7 @@ class PagesTest extends \MailPoetTest { $this->testData['queueId'] = 1; SettingsController::getInstance()->set('tracking.level', TrackingConfig::LEVEL_PARTIAL); $pages = $this->getPages(null, $unsubscribesMock)->init($action = 'unsubscribe', $this->testData); - $pages->unsubscribe(); + $pages->unsubscribe(StatisticsUnsubscribeEntity::METHOD_LINK); } public function testItDontTrackUnsubscribeWhenTrackingIsDisabled() { @@ -189,13 +189,13 @@ class PagesTest extends \MailPoetTest { $this->testData['queueId'] = 1; SettingsController::getInstance()->set('tracking.level', TrackingConfig::LEVEL_BASIC); $pages = $this->getPages(null, $unsubscribesMock)->init($action = 'unsubscribe', $this->testData); - $pages->unsubscribe(); + $pages->unsubscribe(StatisticsUnsubscribeEntity::METHOD_LINK); } public function testItDoesntUnsubscribeWhenPreviewing() { $this->testData['preview'] = 1; $pages = $this->getPages()->init($action = 'unsubscribe', $this->testData); - $pages->unsubscribe(); + $pages->unsubscribe(StatisticsUnsubscribeEntity::METHOD_LINK); $updatedSubscriber = $this->subscribersRepository->findOneById($this->subscriber->getId()); $this->assertInstanceOf(SubscriberEntity::class, $updatedSubscriber);