diff --git a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php index e0f0ed0cf1..72cf8c625d 100644 --- a/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/mailpoet/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -20,6 +20,7 @@ use MailPoet\Models\StatisticsNewsletters as StatisticsNewslettersModel; use MailPoet\Models\Subscriber as SubscriberModel; use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Sending\ScheduledTasksRepository; +use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SubscribersFinder; use MailPoet\Subscribers\SubscribersRepository; @@ -78,6 +79,9 @@ class SendingQueue { /** @var SubscribersRepository */ private $subscribersRepository; + /** @var SendingQueuesRepository */ + private $sendingQueueRepository; + public function __construct( SendingErrorHandler $errorHandler, SendingThrottlingHandler $throttlingHandler, @@ -92,6 +96,7 @@ class SendingQueue { ScheduledTasksRepository $scheduledTasksRepository, MailerTask $mailerTask, SubscribersRepository $subscribersRepository, + SendingQueuesRepository $sendingQueuesRepository, $newsletterTask = false ) { $this->errorHandler = $errorHandler; @@ -109,6 +114,7 @@ class SendingQueue { $this->links = $links; $this->scheduledTasksRepository = $scheduledTasksRepository; $this->subscribersRepository = $subscribersRepository; + $this->sendingQueueRepository = $sendingQueuesRepository; } public function process($timer = false) { @@ -160,13 +166,34 @@ class SendingQueue { return; } + $campaignId = null; + + $afterPreProcessFilter = function(array $renderedNewsletters, NewsletterEntity $renderedNewsletterEntity) use ($newsletterEntity, &$campaignId) { + if ($newsletterEntity !== $renderedNewsletterEntity || !isset($renderedNewsletters['text'])) { + return; + } + $textVersion = $renderedNewsletters['text']; + $campaignId = $this->calculateCampaignId($newsletterEntity, $textVersion); + return $renderedNewsletters; + }; + + // This filter fires during preProcessNewsletter, after some initial rendering but before any shortcodes are replaced. + $this->wp->addFilter('mailpoet_sending_newsletter_render_after_pre_process', $afterPreProcessFilter, 10, 2); + // pre-process newsletter (render, replace shortcodes/links, etc.) $newsletterEntity = $this->newsletterTask->preProcessNewsletter($newsletterEntity, $queue); + + $this->wp->removeFilter('mailpoet_sending_newsletter_render_after_pre_process', $afterPreProcessFilter); + if (!$newsletterEntity) { $this->deleteTask($queue); return; } + if ($campaignId) { + $this->sendingQueueRepository->addCampaignId($queue->getSendingQueueEntity(), $campaignId); + } + $newsletter = Newsletter::findOne($newsletterEntity->getId()); if (!$newsletter) { return; @@ -389,6 +416,10 @@ class SendingQueue { ); } + public function calculateCampaignId(NewsletterEntity $newsletter, string $textBody): string { + return substr(md5(implode('|', [$newsletter->getId(), $textBody, $newsletter->getSubject()])), 0, 16); + } + /** * Checks whether some of segments was deleted or trashed * @param int[] $segmentIds diff --git a/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php b/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php index ce4020c8f5..e70023a865 100644 --- a/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php +++ b/mailpoet/lib/Newsletter/Sending/SendingQueuesRepository.php @@ -150,4 +150,14 @@ class SendingQueuesRepository extends Repository { ->getQuery() ->execute(); } + + public function addCampaignId(SendingQueueEntity $queue, string $campaignId): void { + $meta = $queue->getMeta(); + if (!is_array($meta)) { + $meta = []; + } + $meta['campaignId'] = $campaignId; + $queue->setMeta($meta); + $this->flush(); + } } diff --git a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php index 2319e5a1bf..f9409f16d5 100644 --- a/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/mailpoet/tests/integration/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -44,6 +44,7 @@ use MailPoet\Models\SubscriberSegment; use MailPoet\Newsletter\Links\Links; use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Sending\ScheduledTasksRepository; +use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Router\Endpoints\Track; use MailPoet\Router\Router; use MailPoet\Segments\SegmentsRepository; @@ -96,6 +97,8 @@ class SendingQueueTest extends \MailPoetTest { private $scheduledTasksRepository; /** @var SubscribersRepository */ private $subscribersRepository; + /** @var SendingQueuesRepository */ + private $sendingQueuesRepository; public function _before() { parent::_before(); @@ -154,6 +157,7 @@ class SendingQueueTest extends \MailPoetTest { $this->tasksLinks = $this->diContainer->get(TasksLinks::class); $this->scheduledTasksRepository = $this->diContainer->get(ScheduledTasksRepository::class); $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); + $this->sendingQueuesRepository = $this->diContainer->get(SendingQueuesRepository::class); $this->sendingQueueWorker = $this->getSendingQueueWorker(); } @@ -209,7 +213,8 @@ class SendingQueueTest extends \MailPoetTest { $this->tasksLinks, $this->scheduledTasksRepository, $this->diContainer->get(MailerTask::class), - $this->subscribersRepository + $this->subscribersRepository, + $this->sendingQueuesRepository ); try { $sendingQueueWorker->process(); @@ -243,7 +248,8 @@ class SendingQueueTest extends \MailPoetTest { 'sendBulk' => $this->mailerTaskDummyResponse, ] ), - $this->subscribersRepository + $this->subscribersRepository, + $this->sendingQueuesRepository ); $sendingQueueWorker->sendNewsletters( $this->queue, @@ -288,7 +294,8 @@ class SendingQueueTest extends \MailPoetTest { 'sendBulk' => $this->mailerTaskDummyResponse, ] ), - $this->subscribersRepository + $this->subscribersRepository, + $this->sendingQueuesRepository ); $sendingQueueWorker->sendNewsletters( $queue, @@ -327,7 +334,8 @@ class SendingQueueTest extends \MailPoetTest { $this->tasksLinks, $this->scheduledTasksRepository, $this->diContainer->get(MailerTask::class), - $this->subscribersRepository + $this->subscribersRepository, + $this->sendingQueuesRepository ); $sendingQueueWorker->process(); } @@ -650,7 +658,8 @@ class SendingQueueTest extends \MailPoetTest { 'sendBulk' => Stub::consecutive(['response' => false, 'error' => $mailerError], $this->mailerTaskDummyResponse), ] ), - $this->subscribersRepository + $this->subscribersRepository, + $this->sendingQueuesRepository ); $sendingQueueWorker->sendNewsletters( @@ -1049,7 +1058,8 @@ class SendingQueueTest extends \MailPoetTest { 'sendBulk' => $this->mailerTaskDummyResponse, ] ), - $this->subscribersRepository + $this->subscribersRepository, + $this->sendingQueuesRepository ); try { $sendingQueueWorker->sendNewsletters( @@ -1271,7 +1281,8 @@ class SendingQueueTest extends \MailPoetTest { $this->tasksLinks, $this->scheduledTasksRepository, $mailerMock ?? $this->diContainer->get(MailerTask::class), - $this->subscribersRepository + $this->subscribersRepository, + $this->sendingQueuesRepository ); } }