300 lines
7.1 KiB
PHP
300 lines
7.1 KiB
PHP
<?php
|
||
defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
|
||
|
||
/**
|
||
* Basis class that handles events.
|
||
*
|
||
* @since 1.7
|
||
* @author Grégory Viguier
|
||
*/
|
||
abstract class Imagify_Abstract_Cron {
|
||
|
||
/**
|
||
* Class version.
|
||
*
|
||
* @var string
|
||
* @since 1.7
|
||
*/
|
||
const VERSION = '1.0';
|
||
|
||
/**
|
||
* Cron name.
|
||
*
|
||
* @var string
|
||
* @since 1.7
|
||
* @access protected
|
||
*/
|
||
protected $event_name = '';
|
||
|
||
/**
|
||
* Cron recurrence.
|
||
*
|
||
* @var string
|
||
* @since 1.7
|
||
* @access protected
|
||
*/
|
||
protected $event_recurrence = '';
|
||
|
||
/**
|
||
* Cron time.
|
||
*
|
||
* @var string
|
||
* @since 1.7
|
||
* @access protected
|
||
*/
|
||
protected $event_time = '';
|
||
|
||
/**
|
||
* The single instance of the class.
|
||
*
|
||
* @var object
|
||
* @since 1.7
|
||
* @access protected
|
||
*/
|
||
protected static $_instance;
|
||
|
||
/**
|
||
* Get the main Instance.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return object Main instance.
|
||
*/
|
||
public static function get_instance() {
|
||
if ( ! isset( self::$_instance ) ) {
|
||
self::$_instance = new self();
|
||
}
|
||
|
||
return self::$_instance;
|
||
}
|
||
|
||
|
||
/** ----------------------------------------------------------------------------------------- */
|
||
/** INIT ==================================================================================== */
|
||
/** ----------------------------------------------------------------------------------------- */
|
||
|
||
/**
|
||
* Launch hooks.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*/
|
||
public function init() {
|
||
add_action( 'init', array( $this, 'schedule_event' ) );
|
||
add_action( $this->get_event_name(), array( $this, 'do_event' ) );
|
||
add_filter( 'cron_schedules', array( $this, 'maybe_add_recurrence' ) );
|
||
|
||
if ( did_action( static::get_deactivation_hook_name() ) ) {
|
||
$this->unschedule_event();
|
||
} else {
|
||
add_action( static::get_deactivation_hook_name(), array( $this, 'unschedule_event' ) );
|
||
}
|
||
}
|
||
|
||
|
||
/** ----------------------------------------------------------------------------------------- */
|
||
/** HOOKS =================================================================================== */
|
||
/** ----------------------------------------------------------------------------------------- */
|
||
|
||
/**
|
||
* Initiate the event.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*/
|
||
public function schedule_event() {
|
||
if ( ! wp_next_scheduled( $this->get_event_name() ) ) {
|
||
wp_schedule_event( $this->get_event_timestamp(), $this->get_event_recurrence(), $this->get_event_name() );
|
||
}
|
||
}
|
||
|
||
/**
|
||
* The event action.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*/
|
||
abstract public function do_event();
|
||
|
||
/**
|
||
* Unschedule the event at plugin or submodule deactivation.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*/
|
||
public function unschedule_event() {
|
||
wp_clear_scheduled_hook( $this->get_event_name() );
|
||
}
|
||
|
||
/**
|
||
* Add the event recurrence schedule.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @see wp_get_schedules()
|
||
* @author Grégory Viguier
|
||
*
|
||
* @param array $schedules An array of non-default cron schedules. Default empty.
|
||
*
|
||
* @return array
|
||
*/
|
||
public function maybe_add_recurrence( $schedules ) {
|
||
$default_schedules = array(
|
||
'hourly' => 1,
|
||
'twicedaily' => 1,
|
||
'daily' => 1,
|
||
);
|
||
|
||
$event_recurrence = $this->get_event_recurrence();
|
||
|
||
if ( ! empty( $schedules[ $event_recurrence ] ) || ! empty( $default_schedules[ $event_recurrence ] ) ) {
|
||
return $schedules;
|
||
}
|
||
|
||
$recurrences = array(
|
||
'weekly' => array(
|
||
'interval' => WEEK_IN_SECONDS,
|
||
'display' => __( 'Once Weekly', 'imagify' ),
|
||
),
|
||
);
|
||
|
||
if ( method_exists( $this, 'get_event_recurrence_attributes' ) ) {
|
||
$recurrences[ $event_recurrence ] = $this->get_event_recurrence_attributes();
|
||
}
|
||
|
||
if ( ! empty( $recurrences[ $event_recurrence ] ) ) {
|
||
$schedules[ $event_recurrence ] = $recurrences[ $event_recurrence ];
|
||
}
|
||
|
||
return $schedules;
|
||
}
|
||
|
||
|
||
/** ----------------------------------------------------------------------------------------- */
|
||
/** TOOLS =================================================================================== */
|
||
/** ----------------------------------------------------------------------------------------- */
|
||
|
||
/**
|
||
* Get the cron name.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return string
|
||
*/
|
||
public function get_event_name() {
|
||
return $this->event_name;
|
||
}
|
||
|
||
/**
|
||
* Get the cron recurrence.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return string
|
||
*/
|
||
public function get_event_recurrence() {
|
||
/**
|
||
* Filter the recurrence of the event.
|
||
*
|
||
* @since 1.7
|
||
* @author Grégory Viguier
|
||
*
|
||
* @param string $event_recurrence The recurrence.
|
||
* @param string $event_name Name of the event this recurrence is used for.
|
||
*/
|
||
return apply_filters( 'imagify_event_recurrence', $this->event_recurrence, $this->get_event_name() );
|
||
}
|
||
|
||
/**
|
||
* Get the time to schedule the event.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return string
|
||
*/
|
||
public function get_event_time() {
|
||
/**
|
||
* Filter the time at which the event is triggered (WordPress time).
|
||
*
|
||
* @since 1.7
|
||
* @author Grégory Viguier
|
||
*
|
||
* @param string $event_time A 24H formated time: `hour:minute`.
|
||
* @param string $event_name Name of the event this time is used for.
|
||
*/
|
||
return apply_filters( 'imagify_event_time', $this->event_time, $this->get_event_name() );
|
||
}
|
||
|
||
/**
|
||
* Get the timestamp to schedule the event.
|
||
*
|
||
* @since 1.7
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return int Timestamp.
|
||
*/
|
||
public function get_event_timestamp() {
|
||
return self::get_next_timestamp( $this->get_event_time() );
|
||
}
|
||
|
||
/**
|
||
* Get the timestamp of the next (event) date for the given hour.
|
||
*
|
||
* @since 1.7
|
||
* @author Grégory Viguier
|
||
* @source secupress_get_next_cron_timestamp()
|
||
*
|
||
* @param string $event_time Time when the event callback should be triggered (WordPress time), formated like `hh:mn` (hour:minute).
|
||
*
|
||
* @return int Timestamp.
|
||
*/
|
||
public static function get_next_timestamp( $event_time = '00:00' ) {
|
||
$current_time_int = (int) gmdate( 'Gis' );
|
||
$event_time_int = (int) str_replace( ':', '', $event_time . '00' );
|
||
$event_time = explode( ':', $event_time );
|
||
$event_hour = (int) $event_time[0];
|
||
$event_minute = (int) $event_time[1];
|
||
$offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
|
||
|
||
if ( $event_time_int <= $current_time_int ) {
|
||
// The event time is passed, we need to schedule the event tomorrow.
|
||
return mktime( $event_hour, $event_minute, 0, (int) gmdate( 'n' ), (int) gmdate( 'j' ) + 1 ) - $offset;
|
||
}
|
||
|
||
// We haven't passed the event time yet, schedule the event today.
|
||
return mktime( $event_hour, $event_minute, 0 ) - $offset;
|
||
}
|
||
|
||
/**
|
||
* Get the deactivation hook name.
|
||
*
|
||
* @since 1.9
|
||
* @access public
|
||
* @author Grégory Viguier
|
||
*
|
||
* @return string
|
||
*/
|
||
public static function get_deactivation_hook_name() {
|
||
static $deactivation_hook;
|
||
|
||
if ( ! isset( $deactivation_hook ) ) {
|
||
$deactivation_hook = 'deactivate_' . plugin_basename( IMAGIFY_FILE );
|
||
}
|
||
|
||
return $deactivation_hook;
|
||
}
|
||
}
|