Add meta when sending newsletters

[MAILPOET-2333]
This commit is contained in:
Amine Ben hammou
2019-09-13 04:38:32 +01:00
committed by Jack Kitterhing
parent 3dcde4170e
commit 777cf0bdd7
4 changed files with 141 additions and 4 deletions

View File

@ -9,6 +9,7 @@ use MailPoet\Cron\Workers\StatsNotifications\Scheduler as StatsNotificationsSche
use MailPoet\Logging\Logger; use MailPoet\Logging\Logger;
use MailPoet\Mailer\MailerError; use MailPoet\Mailer\MailerError;
use MailPoet\Mailer\MailerLog; use MailPoet\Mailer\MailerLog;
use MailPoet\Mailer\MetaInfo;
use MailPoet\Models\ScheduledTask as ScheduledTaskModel; use MailPoet\Models\ScheduledTask as ScheduledTaskModel;
use MailPoet\Models\StatisticsNewsletters as StatisticsNewslettersModel; use MailPoet\Models\StatisticsNewsletters as StatisticsNewslettersModel;
use MailPoet\Models\Subscriber as SubscriberModel; use MailPoet\Models\Subscriber as SubscriberModel;
@ -31,12 +32,16 @@ class SendingQueue {
/** @var SendingErrorHandler */ /** @var SendingErrorHandler */
private $error_handler; private $error_handler;
/** @var MetaInfo */
private $mailerMetaInfo;
function __construct(SendingErrorHandler $error_handler, StatsNotificationsScheduler $stats_notifications_scheduler, $timer = false, $mailer_task = false, $newsletter_task = false) { function __construct(SendingErrorHandler $error_handler, StatsNotificationsScheduler $stats_notifications_scheduler, $timer = false, $mailer_task = false, $newsletter_task = false) {
$this->error_handler = $error_handler; $this->error_handler = $error_handler;
$this->stats_notifications_scheduler = $stats_notifications_scheduler; $this->stats_notifications_scheduler = $stats_notifications_scheduler;
$this->mailer_task = ($mailer_task) ? $mailer_task : new MailerTask(); $this->mailer_task = ($mailer_task) ? $mailer_task : new MailerTask();
$this->newsletter_task = ($newsletter_task) ? $newsletter_task : new NewsletterTask(); $this->newsletter_task = ($newsletter_task) ? $newsletter_task : new NewsletterTask();
$this->timer = ($timer) ? $timer : microtime(true); $this->timer = ($timer) ? $timer : microtime(true);
$this->mailerMetaInfo = new MetaInfo;
$wp = new WPFunctions; $wp = new WPFunctions;
$this->batch_size = $wp->applyFilters('mailpoet_cron_worker_sending_queue_batch_size', self::BATCH_SIZE); $this->batch_size = $wp->applyFilters('mailpoet_cron_worker_sending_queue_batch_size', self::BATCH_SIZE);
} }
@ -67,6 +72,11 @@ class SendingQueue {
} }
// clone the original object to be used for processing // clone the original object to be used for processing
$_newsletter = (object)$newsletter->asArray(); $_newsletter = (object)$newsletter->asArray();
$options = $newsletter->options()->findMany();
if (!empty($options)) {
$options = array_column($options, 'value', 'name');
}
$_newsletter->options = $options;
// configure mailer // configure mailer
$this->mailer_task->configureMailer($newsletter); $this->mailer_task->configureMailer($newsletter);
// get newsletter segments // get newsletter segments
@ -139,6 +149,7 @@ class SendingQueue {
$prepared_subscribers_ids = []; $prepared_subscribers_ids = [];
$unsubscribe_urls = []; $unsubscribe_urls = [];
$statistics = []; $statistics = [];
$metas = [];
foreach ($subscribers as $subscriber) { foreach ($subscribers as $subscriber) {
// render shortcodes and replace subscriber data in tracked links // render shortcodes and replace subscriber data in tracked links
$prepared_newsletters[] = $prepared_newsletters[] =
@ -154,6 +165,7 @@ class SendingQueue {
$prepared_subscribers_ids[] = $subscriber->id; $prepared_subscribers_ids[] = $subscriber->id;
// save personalized unsubsribe link // save personalized unsubsribe link
$unsubscribe_urls[] = Links::getUnsubscribeUrl($queue, $subscriber->id); $unsubscribe_urls[] = Links::getUnsubscribeUrl($queue, $subscriber->id);
$metas[] = $this->mailerMetaInfo->getNewsletterMetaInfo($newsletter, $subscriber);
// keep track of values for statistics purposes // keep track of values for statistics purposes
$statistics[] = [ $statistics[] = [
'newsletter_id' => $newsletter->id, 'newsletter_id' => $newsletter->id,
@ -167,7 +179,7 @@ class SendingQueue {
$prepared_newsletters[0], $prepared_newsletters[0],
$prepared_subscribers[0], $prepared_subscribers[0],
$statistics[0], $statistics[0],
['unsubscribe_url' => $unsubscribe_urls[0]] ['unsubscribe_url' => $unsubscribe_urls[0], 'meta' => $metas[0]]
); );
$prepared_newsletters = []; $prepared_newsletters = [];
$prepared_subscribers = []; $prepared_subscribers = [];
@ -183,7 +195,7 @@ class SendingQueue {
$prepared_newsletters, $prepared_newsletters,
$prepared_subscribers, $prepared_subscribers,
$statistics, $statistics,
['unsubscribe_url' => $unsubscribe_urls] ['unsubscribe_url' => $unsubscribe_urls, 'meta' => $metas]
); );
} }
return $queue; return $queue;

View File

@ -1,6 +1,7 @@
<?php <?php
namespace MailPoet\Mailer; namespace MailPoet\Mailer;
use MailPoet\Models\Newsletter;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
class MetaInfo { class MetaInfo {
@ -28,6 +29,28 @@ class MetaInfo {
return $this->makeMetaInfo('new_subscriber_notification', 'unknown', 'administrator'); return $this->makeMetaInfo('new_subscriber_notification', 'unknown', 'administrator');
} }
function getNewsletterMetaInfo($newsletter, Subscriber $subscriber) {
$type = 'unknown';
switch ($newsletter->type) {
case Newsletter::TYPE_AUTOMATIC:
$group = isset($newsletter->options['group']) ? $newsletter->options['group'] : 'unknown';
$event = isset($newsletter->options['event']) ? $newsletter->options['event'] : 'unknown';
$type = sprintf('automatic_%s_%s', $group, $event);
break;
case Newsletter::TYPE_STANDARD:
$type = 'newsletter';
break;
case Newsletter::TYPE_WELCOME:
$type = 'welcome';
break;
case Newsletter::TYPE_NOTIFICATION:
case Newsletter::TYPE_NOTIFICATION_HISTORY:
$type = 'post_notification';
break;
}
return $this->makeMetaInfo($type, $subscriber->status, $subscriber->source);
}
private function makeMetaInfo($email_type, $subscriber_status, $subscriber_source) { private function makeMetaInfo($email_type, $subscriber_status, $subscriber_source) {
return [ return [
'email_type' => $email_type, 'email_type' => $email_type,

View File

@ -60,6 +60,7 @@ class SendingQueueTest extends \MailPoetTest {
$this->subscriber->first_name = 'John'; $this->subscriber->first_name = 'John';
$this->subscriber->last_name = 'Doe'; $this->subscriber->last_name = 'Doe';
$this->subscriber->status = Subscriber::STATUS_SUBSCRIBED; $this->subscriber->status = Subscriber::STATUS_SUBSCRIBED;
$this->subscriber->source = 'administrator';
$this->subscriber->save(); $this->subscriber->save();
$this->segment = Segment::create(); $this->segment = Segment::create();
$this->segment->name = 'segment'; $this->segment->name = 'segment';
@ -250,6 +251,12 @@ class SendingQueueTest extends \MailPoetTest {
'send' => Expected::exactly(1, function($newsletter, $subscriber, $extra_params) use ($directUnsubscribeURL) { 'send' => Expected::exactly(1, function($newsletter, $subscriber, $extra_params) use ($directUnsubscribeURL) {
expect(isset($extra_params['unsubscribe_url']))->true(); expect(isset($extra_params['unsubscribe_url']))->true();
expect($extra_params['unsubscribe_url'])->equals($directUnsubscribeURL); expect($extra_params['unsubscribe_url'])->equals($directUnsubscribeURL);
expect(isset($extra_params['meta']))->true();
expect($extra_params['meta'])->equals([
'email_type' => 'newsletter',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'administrator',
]);
return true; return true;
}), }),
], ],
@ -272,6 +279,12 @@ class SendingQueueTest extends \MailPoetTest {
'send' => Expected::exactly(1, function($newsletter, $subscriber, $extra_params) use ($trackedUnsubscribeURL) { 'send' => Expected::exactly(1, function($newsletter, $subscriber, $extra_params) use ($trackedUnsubscribeURL) {
expect(isset($extra_params['unsubscribe_url']))->true(); expect(isset($extra_params['unsubscribe_url']))->true();
expect($extra_params['unsubscribe_url'])->equals($trackedUnsubscribeURL); expect($extra_params['unsubscribe_url'])->equals($trackedUnsubscribeURL);
expect(isset($extra_params['meta']))->true();
expect($extra_params['meta'])->equals([
'email_type' => 'newsletter',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'administrator',
]);
return true; return true;
}), }),
], ],

View File

@ -3,6 +3,7 @@ namespace MailPoet\Test\Mailer;
use Codeception\Stub; use Codeception\Stub;
use MailPoet\Mailer\MetaInfo; use MailPoet\Mailer\MetaInfo;
use MailPoet\Models\Newsletter;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
class MetaInfoTest extends \MailPoetTest { class MetaInfoTest extends \MailPoetTest {
@ -47,8 +48,8 @@ class MetaInfoTest extends \MailPoetTest {
} }
function testItGetsMetaInfoForConfirmationEmails() { function testItGetsMetaInfoForConfirmationEmails() {
$subscriber = Subscriber::createOrUpdate([ $subscriber = Subscriber::create();
'email' => 'meta@test.fake', $subscriber->hydrate([
'status' => 'unconfirmed', 'status' => 'unconfirmed',
'source' => 'form', 'source' => 'form',
]); ]);
@ -67,6 +68,94 @@ class MetaInfoTest extends \MailPoetTest {
]); ]);
} }
function testItGetsMetaInfoForStandardNewsletter() {
$subscriber = Subscriber::create();
$subscriber->hydrate([
'status' => 'subscribed',
'source' => 'form',
]);
$newsletter = (object)[
'type' => Newsletter::TYPE_STANDARD,
];
expect($this->meta->getNewsletterMetaInfo($newsletter, $subscriber))->equals([
'email_type' => 'newsletter',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'form',
]);
}
function testItGetsMetaInfoForWelcomeEmail() {
$subscriber = Subscriber::create();
$subscriber->hydrate([
'status' => 'subscribed',
'source' => 'form',
]);
$newsletter = (object)[
'type' => Newsletter::TYPE_WELCOME,
];
expect($this->meta->getNewsletterMetaInfo($newsletter, $subscriber))->equals([
'email_type' => 'welcome',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'form',
]);
}
function testItGetsMetaInfoForPostNotification() {
$subscriber = Subscriber::create();
$subscriber->hydrate([
'status' => 'subscribed',
'source' => 'form',
]);
$newsletter1 = (object)[
'type' => Newsletter::TYPE_NOTIFICATION,
];
$newsletter2 = (object)[
'type' => Newsletter::TYPE_NOTIFICATION_HISTORY,
];
expect($this->meta->getNewsletterMetaInfo($newsletter1, $subscriber))->equals([
'email_type' => 'post_notification',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'form',
]);
expect($this->meta->getNewsletterMetaInfo($newsletter2, $subscriber))->equals([
'email_type' => 'post_notification',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'form',
]);
}
function testItGetsMetaInfoForAutomaticEmails() {
$subscriber = Subscriber::create();
$subscriber->hydrate([
'status' => 'subscribed',
'source' => 'form',
]);
$newsletter1 = (object)[
'type' => Newsletter::TYPE_AUTOMATIC,
'options' => [
'group' => 'woocommerce',
'event' => 'woocommerce_first_purchase',
],
];
$newsletter2 = (object)[
'type' => Newsletter::TYPE_AUTOMATIC,
'options' => [
'group' => 'woocommerce',
'event' => 'woocommerce_purchased_in_category',
],
];
expect($this->meta->getNewsletterMetaInfo($newsletter1, $subscriber))->equals([
'email_type' => 'automatic_woocommerce_woocommerce_first_purchase',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'form',
]);
expect($this->meta->getNewsletterMetaInfo($newsletter2, $subscriber))->equals([
'email_type' => 'automatic_woocommerce_woocommerce_purchased_in_category',
'subscriber_status' => 'subscribed',
'subscriber_source' => 'form',
]);
}
function _after() { function _after() {
Subscriber::deleteMany(); Subscriber::deleteMany();
} }