wp = $wp; } public function init(): void { $this->wp->addAction('wp_ajax_nopriv_' . self::AJAX_ACTION_NAME, [$this, 'runActionScheduler'], 0); } /** * Attempts to spawn Action Scheduler runner via ajax request * @see https://actionscheduler.org/perf/#increasing-initialisation-rate-of-runners */ public function triggerExecutor(): void { $this->wp->addFilter('https_local_ssl_verify', '__return_false', 100); $this->wp->wpRemotePost($this->wp->adminUrl('admin-ajax.php'), [ 'method' => 'POST', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => false, 'headers' => [], 'body' => [ 'action' => self::AJAX_ACTION_NAME, ], 'cookies' => [], ]); } public function runActionScheduler(): void { $this->wp->addFilter('action_scheduler_queue_runner_concurrent_batches', [$this, 'ensureConcurrency']); \ActionScheduler_QueueRunner::instance()->run(); wp_die(); } /** * When triggering new runner at the end of a runner execution * we need to make sure the concurrency allows more one runner. */ public function ensureConcurrency(int $concurrency): int { return ($concurrency) < 2 ? 2 : $concurrency; } }