222 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * WP Cron job container.
 | |
|  */
 | |
| class scbCron {
 | |
| 	protected $schedule;
 | |
| 	protected $interval;
 | |
| 	protected $time;
 | |
| 
 | |
| 	protected $hook;
 | |
| 	protected $callback_args = array();
 | |
| 
 | |
| 	/**
 | |
| 	 * Create a new cron job.
 | |
| 	 *
 | |
| 	 * @param array       $args List of args:
 | |
| 	 *                          string $action OR callback $callback
 | |
| 	 *                          string $schedule OR number $interval
 | |
| 	 *                          array $callback_args (optional)
 | |
| 	 *
 | |
| 	 * @param string|bool $file (optional) Reference to main plugin file
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function __construct( $args, $file = false ) {
 | |
| 
 | |
| 		// Set time & schedule
 | |
| 		if ( isset( $args['time'] ) ) {
 | |
| 			$this->time = $args['time'];
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $args['interval'] ) ) {
 | |
| 			$this->schedule = $args['interval'] . 'secs';
 | |
| 			$this->interval = $args['interval'];
 | |
| 		} elseif ( isset( $args['schedule'] ) ) {
 | |
| 			$this->schedule = $args['schedule'];
 | |
| 		}
 | |
| 
 | |
| 		// Set hook
 | |
| 		if ( isset( $args['action'] ) ) {
 | |
| 			$this->hook = $args['action'];
 | |
| 		} else if ( isset( $args['callback'] ) ) {
 | |
| 			$this->hook = self::_callback_to_string( $args['callback'] );
 | |
| 			add_action( $this->hook, $args['callback'] );
 | |
| 		} else if ( method_exists( $this, 'callback' ) ) {
 | |
| 			$this->hook = self::_callback_to_string( array( $this, 'callback' ) );
 | |
| 			add_action( $this->hook, $args['callback'] );
 | |
| 		} else {
 | |
| 			trigger_error( '$action OR $callback not set', E_USER_WARNING );
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $args['callback_args'] ) ) {
 | |
| 			$this->callback_args = (array) $args['callback_args'];
 | |
| 		}
 | |
| 
 | |
| 		if ( $file && $this->schedule ) {
 | |
| 			scbUtil::add_activation_hook( $file, array( $this, 'reset' ) );
 | |
| 			register_deactivation_hook( $file, array( $this, 'unschedule' ) );
 | |
| 		}
 | |
| 
 | |
| 		add_filter( 'cron_schedules', array( $this, '_add_timing' ) );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Change the interval of the cron job.
 | |
| 	 *
 | |
| 	 * @param array $args List of args:
 | |
| 	 *                    string $schedule OR number $interval
 | |
| 	 *                    timestamp $time ( optional )
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function reschedule( $args ) {
 | |
| 
 | |
| 		if ( $args['schedule'] && $this->schedule != $args['schedule'] ) {
 | |
| 			$this->schedule = $args['schedule'];
 | |
| 		} elseif ( $args['interval'] && $this->interval != $args['interval'] ) {
 | |
| 			$this->schedule = $args['interval'] . 'secs';
 | |
| 			$this->interval = $args['interval'];
 | |
| 		}
 | |
| 
 | |
| 		$this->time = $args['time'];
 | |
| 
 | |
| 		$this->reset();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Reset the schedule.
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function reset() {
 | |
| 		$this->unschedule();
 | |
| 		$this->schedule();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Clear the cron job.
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function unschedule() {
 | |
| #		wp_clear_scheduled_hook( $this->hook, $this->callback_args );
 | |
| 		self::really_clear_scheduled_hook( $this->hook );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Execute the job now.
 | |
| 	 *
 | |
| 	 * @param array $args (optional) List of arguments to pass to the callback.
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function do_now( $args = null ) {
 | |
| 		if ( is_null( $args ) ) {
 | |
| 			$args = $this->callback_args;
 | |
| 		}
 | |
| 
 | |
| 		do_action_ref_array( $this->hook, $args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Execute the job with a given delay.
 | |
| 	 *
 | |
| 	 * @param int   $delay (optional) Delay in seconds.
 | |
| 	 * @param array $args  (optional) List of arguments to pass to the callback.
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	public function do_once( $delay = 0, $args = null ) {
 | |
| 		if ( is_null( $args ) ) {
 | |
| 			$args = $this->callback_args;
 | |
| 		}
 | |
| 
 | |
| 		wp_clear_scheduled_hook( $this->hook, $args );
 | |
| 		wp_schedule_single_event( time() + $delay, $this->hook, $args );
 | |
| 	}
 | |
| 
 | |
| 
 | |
| //_____INTERNAL METHODS_____
 | |
| 
 | |
| 	/**
 | |
| 	 * Adds custom schedule timing.
 | |
| 	 *
 | |
| 	 * @param array $schedules
 | |
| 	 *
 | |
| 	 * @return array
 | |
| 	 */
 | |
| 	public function _add_timing( $schedules ) {
 | |
| 		if ( isset( $schedules[ $this->schedule ] ) ) {
 | |
| 			return $schedules;
 | |
| 		}
 | |
| 
 | |
| 		$schedules[ $this->schedule ] = array(
 | |
| 			'interval' => $this->interval,
 | |
| 			'display'  => $this->interval . ' seconds',
 | |
| 		);
 | |
| 
 | |
| 		return $schedules;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Schedule the job.
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	protected function schedule() {
 | |
| 		if ( ! $this->time ) {
 | |
| 			$this->time = time();
 | |
| 		}
 | |
| 
 | |
| 		wp_schedule_event( $this->time, $this->schedule, $this->hook, $this->callback_args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Clears scheduled job.
 | |
| 	 *
 | |
| 	 * @param string $name
 | |
| 	 *
 | |
| 	 * @return void
 | |
| 	 */
 | |
| 	protected static function really_clear_scheduled_hook( $name ) {
 | |
| 		$crons = _get_cron_array();
 | |
| 
 | |
| 		foreach ( $crons as $timestamp => $hooks ) {
 | |
| 			foreach ( $hooks as $hook => $args ) {
 | |
| 				if ( $hook == $name ) {
 | |
| 					unset( $crons[ $timestamp ][ $hook ] );
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if ( empty( $crons[ $timestamp ] ) ) {
 | |
| 				unset( $crons[ $timestamp ] );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		_set_cron_array( $crons );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Generates a hook name from given callback.
 | |
| 	 *
 | |
| 	 * @param callback $callback
 | |
| 	 *
 | |
| 	 * @return string
 | |
| 	 */
 | |
| 	protected static function _callback_to_string( $callback ) {
 | |
| 		if ( ! is_array( $callback ) ) {
 | |
| 			$str = $callback;
 | |
| 		} else if ( ! is_string( $callback[0] ) ) {
 | |
| 			$str = get_class( $callback[0] ) . '_' . $callback[1];
 | |
| 		} else {
 | |
| 			$str = $callback[0] . '::' . $callback[1];
 | |
| 		}
 | |
| 
 | |
| 		$str .= '_hook';
 | |
| 
 | |
| 		return $str;
 | |
| 	}
 | |
| }
 | |
| 
 |