Add meta when sending newsletters
[MAILPOET-2333]
This commit is contained in:
committed by
Jack Kitterhing
parent
3dcde4170e
commit
777cf0bdd7
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user