- Implements welcome e-mail scheduling
This commit is contained in:
@ -221,6 +221,7 @@ class Migrator {
|
||||
'count_processed mediumint(9) NOT NULL DEFAULT 0,',
|
||||
'count_to_process 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,',
|
||||
'created_at TIMESTAMP NOT NULL DEFAULT 0,',
|
||||
'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,',
|
||||
|
@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace MailPoet\Models;
|
||||
use MailPoet\Mailer\Mailer;
|
||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||
use MailPoet\Util\Helpers;
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
@ -208,6 +209,7 @@ class Subscriber extends Model {
|
||||
|
||||
if($subscriber->save()) {
|
||||
$subscriber->addToSegments($segment_ids);
|
||||
Scheduler::newSegmentSubscriptionNewsletter($subscriber, $segment_ids);
|
||||
}
|
||||
}
|
||||
|
||||
|
71
lib/Newsletter/Scheduler/Scheduler.php
Normal file
71
lib/Newsletter/Scheduler/Scheduler.php
Normal 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();
|
||||
}
|
||||
}
|
@ -2,17 +2,15 @@
|
||||
namespace MailPoet\Segments;
|
||||
use \MailPoet\Models\Subscriber;
|
||||
use \MailPoet\Models\Segment;
|
||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||
|
||||
class WP {
|
||||
static function synchronizeUser($wp_user_id) {
|
||||
$wpUser = \get_userdata($wp_user_id);
|
||||
$wp_user = \get_userdata($wp_user_id);
|
||||
$segment = Segment::getWPUsers();
|
||||
|
||||
if($wpUser === false or $segment === false) return;
|
||||
|
||||
$subscriber = Subscriber::where('wp_user_id', $wpUser->ID)
|
||||
if($wp_user === false or $segment === false) return;
|
||||
$subscriber = Subscriber::where('wp_user_id', $wp_user->ID)
|
||||
->findOne();
|
||||
|
||||
switch(current_filter()) {
|
||||
case 'delete_user':
|
||||
case 'deleted_user':
|
||||
@ -20,23 +18,22 @@ class WP {
|
||||
if($subscriber !== false && $subscriber->id()) {
|
||||
$subscriber->delete();
|
||||
}
|
||||
break;
|
||||
|
||||
break;
|
||||
case 'user_register':
|
||||
$new_user = (!$subscriber) ? true : false;
|
||||
case 'added_existing_user':
|
||||
case 'profile_update':
|
||||
default:
|
||||
// get first name & last name
|
||||
$first_name = $wpUser->first_name;
|
||||
$last_name = $wpUser->last_name;
|
||||
if(empty($wpUser->first_name) && empty($wpUser->last_name)) {
|
||||
$first_name = $wpUser->display_name;
|
||||
$first_name = $wp_user->first_name;
|
||||
$last_name = $wp_user->last_name;
|
||||
if(empty($wp_user->first_name) && empty($wp_user->last_name)) {
|
||||
$first_name = $wp_user->display_name;
|
||||
}
|
||||
|
||||
// subscriber data
|
||||
$data = array(
|
||||
'wp_user_id'=> $wpUser->ID,
|
||||
'email' => $wpUser->user_email,
|
||||
'wp_user_id' => $wp_user->ID,
|
||||
'email' => $wp_user->user_email,
|
||||
'first_name' => $first_name,
|
||||
'last_name' => $last_name,
|
||||
'status' => 'subscribed'
|
||||
@ -46,13 +43,18 @@ class WP {
|
||||
$data['id'] = $subscriber->id();
|
||||
}
|
||||
$subscriber = Subscriber::createOrUpdate($data);
|
||||
|
||||
if($subscriber->getErrors() === false && $subscriber->id > 0) {
|
||||
if($segment !== false) {
|
||||
$segment->addSubscriber($subscriber->id);
|
||||
}
|
||||
if(isset($new_user) && $new_user === true) {
|
||||
Scheduler::newUserRegistrationNewsletter(
|
||||
$subscriber->asArray(),
|
||||
(array) $wp_user
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user