- Adds queue rescheduling for post notifications
This commit is contained in:
@@ -66,19 +66,34 @@ class Scheduler {
|
||||
}
|
||||
|
||||
function processPostNotificationNewsletter($newsletter, $queue) {
|
||||
$immediate_interval =
|
||||
\MailPoet\Newsletter\Scheduler\Scheduler::INTERVAL_IMMEDIATELY;
|
||||
$segments = unserialize($newsletter->segments);
|
||||
if(empty($segments)) {
|
||||
if(empty($segments) && $newsletter->intervalType === $immediate_interval) {
|
||||
$queue->delete();
|
||||
return;
|
||||
} else {
|
||||
self::updateQueueNextRunDate($queue, $newsletter);
|
||||
return;
|
||||
}
|
||||
$subscribers = Subscriber::getSubscribedInSegments($segments)
|
||||
->findArray();
|
||||
$subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id');
|
||||
$subscribers = array_unique($subscribers);
|
||||
if(empty($subscribers)) {
|
||||
if(empty($subscribers) && $newsletter->intervalType === $immediate_interval) {
|
||||
$queue->delete();
|
||||
return;
|
||||
} else {
|
||||
self::updateQueueNextRunDate($queue, $newsletter);
|
||||
return;
|
||||
}
|
||||
// schedule new queue if the post notification is not destined for immediate delivery
|
||||
if ($newsletter->intervalType !== $immediate_interval) {
|
||||
$new_queue = clone($queue);
|
||||
$new_queue->scheduled_at = self::updateQueueNextRunDate($new_queue, $newsletter);
|
||||
$new_queue->save();
|
||||
}
|
||||
$new_scheduled_queue = SendingQueue::create();
|
||||
$queue->subscribers = serialize(
|
||||
array(
|
||||
'to_process' => $subscribers
|
||||
@@ -152,4 +167,11 @@ class Scheduler {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private function updateQueueNextRunDate($queue, $newsletter) {
|
||||
$next_run_date =
|
||||
\MailPoet\Newsletter\Scheduler\Scheduler::getNextRunDate($newsletter->schedule);
|
||||
$queue->scheduled_at = $next_run_date;
|
||||
$queue->save();
|
||||
}
|
||||
}
|
||||
|
@@ -23,6 +23,7 @@ class SendingQueue {
|
||||
private $timer;
|
||||
const BATCH_SIZE = 50;
|
||||
const DIVIDER = '***MailPoet***';
|
||||
const STATUS_COMPLETED = 'completed';
|
||||
|
||||
function __construct($timer = false) {
|
||||
$this->mta_config = $this->getMailerConfig();
|
||||
@@ -320,7 +321,7 @@ class SendingQueue {
|
||||
$queue->count_processed + $queue->count_to_process;
|
||||
if(!$queue->count_to_process) {
|
||||
$queue->processed_at = current_time('mysql');
|
||||
$queue->status = 'completed';
|
||||
$queue->status = self::STATUS_COMPLETED;
|
||||
}
|
||||
$queue->subscribers = serialize((array) $queue->subscribers);
|
||||
$queue->save();
|
||||
|
@@ -12,6 +12,13 @@ class Scheduler {
|
||||
const SECONDS_IN_HOUR = 3600;
|
||||
const LAST_WEEKDAY_FORMAT = 'L';
|
||||
const WORDPRESS_ALL_ROLES = 'mailpoet_all';
|
||||
const INTERVAL_IMMEDIATELY = 'immediately';
|
||||
const INTERVAL_IMMEDIATE = 'immediate';
|
||||
const INTERVAL_DAILY = 'daily';
|
||||
const INTERVAL_WEEKLY = 'weekly';
|
||||
const INTERVAL_MONTHLY = 'monthly';
|
||||
const INTERVAL_NTHWEEKDAY = 'nthWeekDay';
|
||||
const STATUS_SCHEDULED = 'scheduled';
|
||||
|
||||
static function processPostNotificationSchedule($newsletter_id) {
|
||||
$newsletter = Newsletter::filter('filterWithOptions')
|
||||
@@ -26,22 +33,22 @@ class Scheduler {
|
||||
$newsletter['nthWeekDay'] :
|
||||
'#' . $newsletter['nthWeekDay'];
|
||||
switch($interval_type) {
|
||||
case 'immediately':
|
||||
case self::INTERVAL_IMMEDIATELY:
|
||||
$schedule = '* * * * *';
|
||||
break;
|
||||
case 'immediate':
|
||||
case 'daily':
|
||||
case self::INTERVAL_IMMEDIATE:
|
||||
case self::INTERVAL_DAILY:
|
||||
$schedule = sprintf('0 %s * * *', $hour);
|
||||
break;
|
||||
case 'weekly':
|
||||
case self::INTERVAL_WEEKLY:
|
||||
$schedule = sprintf('0 %s * * %s', $hour, $week_day);
|
||||
break;
|
||||
case 'monthly':
|
||||
$schedule = sprintf('0 %s %s * *', $hour, $month_day);
|
||||
break;
|
||||
case 'nthWeekDay':
|
||||
case self::INTERVAL_NTHWEEKDAY:
|
||||
$schedule = sprintf('0 %s ? * %s%s', $hour, $week_day, $nth_week_day);
|
||||
break;
|
||||
case self::INTERVAL_MONTHLY:
|
||||
$schedule = sprintf('0 %s %s * *', $hour, $month_day);
|
||||
break;
|
||||
}
|
||||
$option_field = NewsletterOptionField::where('name', 'schedule')
|
||||
->findOne()
|
||||
@@ -157,7 +164,7 @@ class Scheduler {
|
||||
default:
|
||||
$scheduled_at = $current_time;
|
||||
}
|
||||
$queue->status = 'scheduled';
|
||||
$queue->status = self::STATUS_SCHEDULED;
|
||||
$queue->scheduled_at = $scheduled_at;
|
||||
$queue->save();
|
||||
}
|
||||
|
Reference in New Issue
Block a user