Execute WordPress cron trigger with a time interval [MAILPOET-2181]
This commit is contained in:
@ -5,6 +5,7 @@ namespace MailPoet\API\JSON\v1;
|
|||||||
use MailPoet\API\JSON\Endpoint as APIEndpoint;
|
use MailPoet\API\JSON\Endpoint as APIEndpoint;
|
||||||
use MailPoet\API\JSON\Error as APIError;
|
use MailPoet\API\JSON\Error as APIError;
|
||||||
use MailPoet\Config\AccessControl;
|
use MailPoet\Config\AccessControl;
|
||||||
|
use MailPoet\Cron\Triggers\WordPress;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\SendingQueue as SendingQueueModel;
|
use MailPoet\Models\SendingQueue as SendingQueueModel;
|
||||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||||
@ -67,6 +68,8 @@ class SendingQueue extends APIEndpoint {
|
|||||||
$queue->newsletter_id = $newsletter->id;
|
$queue->newsletter_id = $newsletter->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WordPress::resetRunInterval();
|
||||||
|
|
||||||
if ((bool)$newsletter->isScheduled) {
|
if ((bool)$newsletter->isScheduled) {
|
||||||
// set newsletter status
|
// set newsletter status
|
||||||
$newsletter->setStatus(Newsletter::STATUS_SCHEDULED);
|
$newsletter->setStatus(Newsletter::STATUS_SCHEDULED);
|
||||||
|
@ -27,14 +27,38 @@ if (!defined('ABSPATH')) exit;
|
|||||||
class WordPress {
|
class WordPress {
|
||||||
const SCHEDULED_IN_THE_PAST = 'past';
|
const SCHEDULED_IN_THE_PAST = 'past';
|
||||||
const SCHEDULED_IN_THE_FUTURE = 'future';
|
const SCHEDULED_IN_THE_FUTURE = 'future';
|
||||||
|
|
||||||
|
const RUN_INTERVAL = 10; // seconds
|
||||||
|
const LAST_RUN_AT_SETTING = 'cron_trigger_wordpress.last_run_at';
|
||||||
|
|
||||||
static private $tasks_counts;
|
static private $tasks_counts;
|
||||||
|
|
||||||
static function run() {
|
static function run() {
|
||||||
|
if (!self::checkRunInterval()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return (self::checkExecutionRequirements()) ?
|
return (self::checkExecutionRequirements()) ?
|
||||||
MailPoet::run() :
|
MailPoet::run() :
|
||||||
self::stop();
|
self::stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static function checkRunInterval() {
|
||||||
|
$settings = new SettingsController();
|
||||||
|
$last_run_at = (int)$settings->get(self::LAST_RUN_AT_SETTING, 0);
|
||||||
|
$run_interval = WPFunctions::get()->applyFilters('mailpoet_cron_trigger_wordpress_run_interval', self::RUN_INTERVAL);
|
||||||
|
$run_interval_elapsed = (time() - $last_run_at) >= $run_interval;
|
||||||
|
if ($run_interval_elapsed) {
|
||||||
|
$settings->set(self::LAST_RUN_AT_SETTING, time());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static function resetRunInterval() {
|
||||||
|
$settings = new SettingsController();
|
||||||
|
$settings->set(self::LAST_RUN_AT_SETTING, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static function checkExecutionRequirements(WPFunctions $wp = null) {
|
static function checkExecutionRequirements(WPFunctions $wp = null) {
|
||||||
self::loadTasksCounts($wp ?: new WPFunctions);
|
self::loadTasksCounts($wp ?: new WPFunctions);
|
||||||
|
|
||||||
|
@ -35,6 +35,31 @@ class WordPressTest extends \MailPoetTest {
|
|||||||
$this->_addScheduledTask(Beamer::TASK_TYPE, ScheduledTask::STATUS_SCHEDULED, Carbon::createFromTimestamp(current_time('timestamp') + 600));
|
$this->_addScheduledTask(Beamer::TASK_TYPE, ScheduledTask::STATUS_SCHEDULED, Carbon::createFromTimestamp(current_time('timestamp') + 600));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItDoesNotRunIfRunIntervalIsNotElapsed() {
|
||||||
|
$current_time = time();
|
||||||
|
$this->settings->set(WordPress::LAST_RUN_AT_SETTING, $current_time);
|
||||||
|
$this->_addQueue($status = SendingQueue::STATUS_SCHEDULED);
|
||||||
|
expect(WordPress::run())->equals(false);
|
||||||
|
expect($this->settings->get(WordPress::LAST_RUN_AT_SETTING))->equals($current_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItRunsIfRunIntervalIsElapsed() {
|
||||||
|
$time_in_the_past = (time() - WordPress::RUN_INTERVAL) - 1;
|
||||||
|
$this->settings->set(WordPress::LAST_RUN_AT_SETTING, $time_in_the_past);
|
||||||
|
$this->_addQueue($status = SendingQueue::STATUS_SCHEDULED);
|
||||||
|
expect(WordPress::run())->notEmpty();
|
||||||
|
expect($this->settings->get(WordPress::LAST_RUN_AT_SETTING))->greaterThan($time_in_the_past);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItCanResetRunInterval() {
|
||||||
|
$current_time = time();
|
||||||
|
$this->settings->set(WordPress::LAST_RUN_AT_SETTING, $current_time);
|
||||||
|
$this->_addQueue($status = SendingQueue::STATUS_SCHEDULED);
|
||||||
|
WordPress::resetRunInterval();
|
||||||
|
expect($this->settings->get(WordPress::LAST_RUN_AT_SETTING))->isEmpty();
|
||||||
|
expect(WordPress::run())->notEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
function testItRequiresScheduledQueuesToExecute() {
|
function testItRequiresScheduledQueuesToExecute() {
|
||||||
expect(WordPress::checkExecutionRequirements())->false();
|
expect(WordPress::checkExecutionRequirements())->false();
|
||||||
$this->_addQueue($status = SendingQueue::STATUS_SCHEDULED);
|
$this->_addQueue($status = SendingQueue::STATUS_SCHEDULED);
|
||||||
|
Reference in New Issue
Block a user