Execute WordPress cron trigger with a time interval [MAILPOET-2181]

This commit is contained in:
wxa
2019-07-26 22:33:33 +03:00
committed by M. Shull
parent 82661248f3
commit e1b8462254
3 changed files with 52 additions and 0 deletions

View File

@ -5,6 +5,7 @@ namespace MailPoet\API\JSON\v1;
use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError;
use MailPoet\Config\AccessControl;
use MailPoet\Cron\Triggers\WordPress;
use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue as SendingQueueModel;
use MailPoet\Newsletter\Scheduler\Scheduler;
@ -67,6 +68,8 @@ class SendingQueue extends APIEndpoint {
$queue->newsletter_id = $newsletter->id;
}
WordPress::resetRunInterval();
if ((bool)$newsletter->isScheduled) {
// set newsletter status
$newsletter->setStatus(Newsletter::STATUS_SCHEDULED);

View File

@ -27,14 +27,38 @@ if (!defined('ABSPATH')) exit;
class WordPress {
const SCHEDULED_IN_THE_PAST = 'past';
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 function run() {
if (!self::checkRunInterval()) {
return false;
}
return (self::checkExecutionRequirements()) ?
MailPoet::run() :
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) {
self::loadTasksCounts($wp ?: new WPFunctions);

View File

@ -35,6 +35,31 @@ class WordPressTest extends \MailPoetTest {
$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() {
expect(WordPress::checkExecutionRequirements())->false();
$this->_addQueue($status = SendingQueue::STATUS_SCHEDULED);