- Implements welcome e-mail scheduling

This commit is contained in:
Vlad
2016-03-16 21:06:09 -04:00
parent 1795964c69
commit 6e289b6a8f
4 changed files with 93 additions and 17 deletions

View File

@ -221,6 +221,7 @@ class Migrator {
'count_processed mediumint(9) NOT NULL DEFAULT 0,', 'count_processed mediumint(9) NOT NULL DEFAULT 0,',
'count_to_process mediumint(9) NOT NULL DEFAULT 0,', 'count_to_process mediumint(9) NOT NULL DEFAULT 0,',
'count_failed mediumint(9) NOT NULL DEFAULT 0,', 'count_failed mediumint(9) NOT NULL DEFAULT 0,',
'scheduled_at TIMESTAMP NOT NULL DEFAULT 0,',
'processed_at TIMESTAMP NOT NULL DEFAULT 0,', 'processed_at TIMESTAMP NOT NULL DEFAULT 0,',
'created_at TIMESTAMP NOT NULL DEFAULT 0,', 'created_at TIMESTAMP NOT NULL DEFAULT 0,',
'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,', 'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,',

View File

@ -1,6 +1,7 @@
<?php <?php
namespace MailPoet\Models; namespace MailPoet\Models;
use MailPoet\Mailer\Mailer; use MailPoet\Mailer\Mailer;
use MailPoet\Newsletter\Scheduler\Scheduler;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
@ -208,6 +209,7 @@ class Subscriber extends Model {
if($subscriber->save()) { if($subscriber->save()) {
$subscriber->addToSegments($segment_ids); $subscriber->addToSegments($segment_ids);
Scheduler::newSegmentSubscriptionNewsletter($subscriber, $segment_ids);
} }
} }

View File

@ -0,0 +1,71 @@
<?php
namespace MailPoet\Newsletter\Scheduler;
use Carbon\Carbon;
use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue;
class Scheduler {
static function newSegmentSubscriptionNewsletter(array $subscriber, array $segments) {
$newsletters = self::getWelcomeNewsletters();
if(!count($newsletters)) return;
foreach($newsletters as $newsletter) {
if($newsletter['event'] === 'segment' &&
in_array($newsletter['segment'], $segments)
) {
self::scheduleWelcomeNewsletter($newsletter, $subscriber);
}
}
}
static function newUserRegistrationNewsletter(array $subscriber, array $wp_user) {
$newsletters = self::getWelcomeNewsletters();
if(!count($newsletters)) return;
foreach($newsletters as $newsletter) {
if($newsletter['event'] === 'user' &&
in_array($newsletter['role'], $wp_user['roles'])
) {
self::scheduleWelcomeNewsletter($newsletter, $subscriber);
}
}
}
private static function getWelcomeNewsletters() {
return Newsletter::where('type', 'welcome')
->filter('filterWithOptions')
->findArray();
}
private static function scheduleWelcomeNewsletter($newsletter, $subscriber) {
$queue = SendingQueue::create();
$queue->newsletter_id = $newsletter['id'];
$queue->subscribers = serialize(
array(
'to_process' => array($subscriber['id'])
)
);
$queue->count_total = $queue->count_to_process = 1;
$after_time_type = $newsletter['afterTimeType'];
$after_time_number = $newsletter['afterTimeNumber'];
$scheduled_at = null;
switch($after_time_type) {
case 'hours':
$scheduled_at = Carbon::now()
->addHours($after_time_number);
break;
case 'days':
$scheduled_at = Carbon::now()
->addDays($after_time_number);
break;
case 'weeks':
$scheduled_at = Carbon::now()
->addWeeks($after_time_number);
break;
}
if($scheduled_at) {
$queue->status = 'scheduled';
$queue->scheduled_at = $scheduled_at;
}
$queue->save();
}
}

View File

@ -2,17 +2,15 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use \MailPoet\Models\Subscriber; use \MailPoet\Models\Subscriber;
use \MailPoet\Models\Segment; use \MailPoet\Models\Segment;
use MailPoet\Newsletter\Scheduler\Scheduler;
class WP { class WP {
static function synchronizeUser($wp_user_id) { static function synchronizeUser($wp_user_id) {
$wpUser = \get_userdata($wp_user_id); $wp_user = \get_userdata($wp_user_id);
$segment = Segment::getWPUsers(); $segment = Segment::getWPUsers();
if($wp_user === false or $segment === false) return;
if($wpUser === false or $segment === false) return; $subscriber = Subscriber::where('wp_user_id', $wp_user->ID)
$subscriber = Subscriber::where('wp_user_id', $wpUser->ID)
->findOne(); ->findOne();
switch(current_filter()) { switch(current_filter()) {
case 'delete_user': case 'delete_user':
case 'deleted_user': case 'deleted_user':
@ -20,23 +18,22 @@ class WP {
if($subscriber !== false && $subscriber->id()) { if($subscriber !== false && $subscriber->id()) {
$subscriber->delete(); $subscriber->delete();
} }
break; break;
case 'user_register': case 'user_register':
$new_user = (!$subscriber) ? true : false;
case 'added_existing_user': case 'added_existing_user':
case 'profile_update': case 'profile_update':
default: default:
// get first name & last name // get first name & last name
$first_name = $wpUser->first_name; $first_name = $wp_user->first_name;
$last_name = $wpUser->last_name; $last_name = $wp_user->last_name;
if(empty($wpUser->first_name) && empty($wpUser->last_name)) { if(empty($wp_user->first_name) && empty($wp_user->last_name)) {
$first_name = $wpUser->display_name; $first_name = $wp_user->display_name;
} }
// subscriber data // subscriber data
$data = array( $data = array(
'wp_user_id'=> $wpUser->ID, 'wp_user_id' => $wp_user->ID,
'email' => $wpUser->user_email, 'email' => $wp_user->user_email,
'first_name' => $first_name, 'first_name' => $first_name,
'last_name' => $last_name, 'last_name' => $last_name,
'status' => 'subscribed' 'status' => 'subscribed'
@ -46,13 +43,18 @@ class WP {
$data['id'] = $subscriber->id(); $data['id'] = $subscriber->id();
} }
$subscriber = Subscriber::createOrUpdate($data); $subscriber = Subscriber::createOrUpdate($data);
if($subscriber->getErrors() === false && $subscriber->id > 0) { if($subscriber->getErrors() === false && $subscriber->id > 0) {
if($segment !== false) { if($segment !== false) {
$segment->addSubscriber($subscriber->id); $segment->addSubscriber($subscriber->id);
} }
if(isset($new_user) && $new_user === true) {
Scheduler::newUserRegistrationNewsletter(
$subscriber->asArray(),
(array) $wp_user
);
}
} }
break; break;
} }
} }