| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <?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 string|bool $file (optional) Reference to main plugin file
- * @param array $args List of args:
- * string $action OR callback $callback
- * string $schedule OR number $interval
- * array $callback_args (optional)
- *
- * @return void
- */
- public function __construct( $file = false, $args ) {
-
- // 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;
- }
- }
|