diff --git a/lib/Segments/DynamicSegments/Filters/EmailAction.php b/lib/Segments/DynamicSegments/Filters/EmailAction.php index 5fb2e858e1..5b1b00a8dd 100644 --- a/lib/Segments/DynamicSegments/Filters/EmailAction.php +++ b/lib/Segments/DynamicSegments/Filters/EmailAction.php @@ -3,6 +3,7 @@ namespace MailPoet\Segments\DynamicSegments\Filters; use MailPoet\Entities\DynamicSegmentFilterEntity; +use MailPoet\Entities\NewsletterLinkEntity; use MailPoet\Entities\StatisticsClickEntity; use MailPoet\Entities\StatisticsNewsletterEntity; use MailPoet\Entities\StatisticsOpenEntity; @@ -47,6 +48,7 @@ class EmailAction implements Filter { $statsSentTable = $this->entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName(); $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); + $newsletterLinksTable = $this->entityManager->getClassMetadata(NewsletterLinkEntity::class)->getTableName(); if (in_array($action, self::CLICK_ACTIONS, true)) { $statsTable = $this->entityManager->getClassMetadata(StatisticsClickEntity::class)->getTableName(); } else { @@ -69,11 +71,22 @@ class EmailAction implements Filter { )->setParameter('newsletter' . $filter->getId(), $newsletterId); $where .= ' AND stats.id IS NULL'; } else if ($action === self::ACTION_CLICKED_ANY) { + $excludedLinks = [ + '[link:subscription_unsubscribe_url]', + '[link:subscription_instant_unsubscribe_url]', + '[link:newsletter_view_in_browser_url]', + '[link:subscription_manage_url]', + ]; $queryBuilder = $queryBuilder->innerJoin( $subscribersTable, $statsTable, 'stats', "stats.subscriber_id = $subscribersTable.id" + )->innerJoin( + 'stats', + $newsletterLinksTable, + 'newsletterLinks', + "stats.link_id = newsletterLinks.id AND newsletterLinks.URL NOT IN ('" . join("', '", $excludedLinks) . "')" ); } else { $queryBuilder = $queryBuilder->innerJoin( diff --git a/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php b/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php index 90fc6e2dd8..4b81cc262a 100644 --- a/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php +++ b/tests/integration/Segments/DynamicSegments/Filters/EmailActionTest.php @@ -55,19 +55,7 @@ class EmailActionTest extends \MailPoetTest { $this->createStatisticsOpens($this->subscriberOpenedClicked); $this->createStatisticsOpens($this->subscriberOpenedNotClicked); - - $link = new NewsletterLinkEntity($this->newsletter, $queue, 'http://example.com', 'asdfgh'); - $this->entityManager->persist($link); - $this->entityManager->flush(); - $click = new StatisticsClickEntity( - $this->newsletter, - $queue, - $this->subscriberOpenedClicked, - $link, - 1 - ); - $this->entityManager->persist($click); - $this->entityManager->flush(); + $this->addClickedToLink('http://example.com', $this->newsletter, $this->subscriberOpenedClicked); } public function testGetOpened() { @@ -140,6 +128,14 @@ class EmailActionTest extends \MailPoetTest { } public function testGetClickedAnyLink() { + $subscriberClickedExcludedLinks = $this->createSubscriber('opened_clicked_excluded@example.com'); + $this->createStatsNewsletter($subscriberClickedExcludedLinks); + $this->createStatisticsOpens($subscriberClickedExcludedLinks); + $this->addClickedToLink('[link:subscription_unsubscribe_url]', $this->newsletter, $subscriberClickedExcludedLinks); + $this->addClickedToLink('[link:subscription_instant_unsubscribe_url]', $this->newsletter, $subscriberClickedExcludedLinks); + $this->addClickedToLink('[link:newsletter_view_in_browser_url]', $this->newsletter, $subscriberClickedExcludedLinks); + $this->addClickedToLink('[link:subscription_manage_url]', $this->newsletter, $subscriberClickedExcludedLinks); + $segmentFilter = $this->getSegmentFilter(EmailAction::ACTION_CLICKED_ANY); $statement = $this->emailAction->apply($this->getQueryBuilder(), $segmentFilter)->execute(); $this->assertInstanceOf(Statement::class, $statement); @@ -234,6 +230,23 @@ class EmailActionTest extends \MailPoetTest { return $open; } + private function addClickedToLink(string $link, NewsletterEntity $newsletter, SubscriberEntity $subscriber) { + $queue = $newsletter->getLatestQueue(); + $this->assertInstanceOf(SendingQueueEntity::class, $queue); + $link = new NewsletterLinkEntity($this->newsletter, $queue, $link, uniqid()); + $this->entityManager->persist($link); + $this->entityManager->flush(); + $click = new StatisticsClickEntity( + $newsletter, + $queue, + $subscriber, + $link, + 1 + ); + $this->entityManager->persist($click); + $this->entityManager->flush(); + } + public function _after() { $this->cleanData(); }