diff --git a/lib/API/JSON/v1/SendingQueue.php b/lib/API/JSON/v1/SendingQueue.php index 300688fc69..1eb46d0e56 100644 --- a/lib/API/JSON/v1/SendingQueue.php +++ b/lib/API/JSON/v1/SendingQueue.php @@ -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); diff --git a/lib/Cron/Triggers/WordPress.php b/lib/Cron/Triggers/WordPress.php index 53e0b77820..4ae80c79b0 100644 --- a/lib/Cron/Triggers/WordPress.php +++ b/lib/Cron/Triggers/WordPress.php @@ -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); diff --git a/tests/integration/Cron/Triggers/WordPressTest.php b/tests/integration/Cron/Triggers/WordPressTest.php index 54d86fa7b3..bada9b17a5 100644 --- a/tests/integration/Cron/Triggers/WordPressTest.php +++ b/tests/integration/Cron/Triggers/WordPressTest.php @@ -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);