<?php declare( strict_types=1 ); namespace Automattic\WooCommerce\GoogleListingsAndAds\Jobs; use Automattic\WooCommerce\GoogleListingsAndAds\ActionScheduler\ActionSchedulerInterface; use Automattic\WooCommerce\GoogleListingsAndAds\Infrastructure\Conditional; use Automattic\WooCommerce\GoogleListingsAndAds\Infrastructure\Registerable; use DateTime; defined( 'ABSPATH' ) || exit; /** * Class JobInitializer * * Initializes all jobs when certain conditions are met (e.g. the request is async or initiated by CRON, CLI, etc.). * * @package Automattic\WooCommerce\GoogleListingsAndAds\Jobs */ class JobInitializer implements Registerable, Conditional { /** * @var JobRepository */ protected $job_repository; /** * @var ActionSchedulerInterface */ protected $action_scheduler; /** * JobInitializer constructor. * * @param JobRepository $job_repository * @param ActionSchedulerInterface $action_scheduler */ public function __construct( JobRepository $job_repository, ActionSchedulerInterface $action_scheduler ) { $this->job_repository = $job_repository; $this->action_scheduler = $action_scheduler; } /** * Initialize all jobs. */ public function register(): void { foreach ( $this->job_repository->list() as $job ) { $job->init(); if ( $job instanceof StartOnHookInterface ) { add_action( $job->get_start_hook()->get_hook(), function ( ...$args ) use ( $job ) { $job->schedule( $args ); }, 10, $job->get_start_hook()->get_argument_count() ); } if ( $job instanceof RecurringJobInterface && ! $this->action_scheduler->has_scheduled_action( $job->get_start_hook()->get_hook() ) && $job->can_schedule() ) { $recurring_date_time = new DateTime( 'tomorrow 3am', wp_timezone() ); $schedule = '0 3 * * *'; // 3 am every day $this->action_scheduler->schedule_cron( $recurring_date_time->getTimestamp(), $schedule, $job->get_start_hook()->get_hook() ); } } } /** * Check whether this object is currently needed. * * @return bool Whether the object is needed. */ public static function is_needed(): bool { return ( defined( 'DOING_AJAX' ) || defined( 'DOING_CRON' ) || ( defined( 'WP_CLI' ) && WP_CLI ) || is_admin() ); } }