Kama_Cron

Click here to view original web page at wp-kama.ru

Небольшой класс для удобного добавления крон событий (задач) в WordPress.

Класс позволяет быстро и удобно создавать cron задачи, чтобы не перепутать ничего, все настройки указываются в параметре при вызове класса, всю рутину по правильной регистрации крон задач и их интервалов класс берет на себя. Функции-обработчики задач нужно писать отдельно!

Код класса Kama_Cron

<?php

/**
 * Удобное добавление крон задач.
 *
 * Можно использовать параметр 'auto_activate'. Или добавить/удалить задача через:
 * - Kama_Cron::activate()   при активации плагина, при обновлении настроек.
 * - Kama_Cron::deactivate() при деактивации плагина.
 *
 * @version: 0.4
 */
class Kama_Cron {

	static $DEBUG = 0; // в рабочем режиме должно быть 0.
					   // Для дебага переходим на http://mysite.com/wp-cron.php
	static $opts;

	protected $id; // внутренняя переменная (для крон задач не используется)

	function __construct( $args ){

		if( empty($args['events']) )
			wp_die( 'ERROR: Kama_Cron events parametr not set. '. print_r(debug_backtrace(), 1) );

		$args_def = [
			'id' => implode( '--', array_keys($args['events']) ), // уникальный идентификатор по которому потом можно обращаться к настройкам

			'auto_activate' => true, // true - автоматически создаст указанное событие, при посещении админ-панели.
									 // в этом случае отдельно вызывать метод activate() не нужно.
			'events' => [
				'hook_name' => [
					'start_time'    => 0,       // с какого момента начать событие. 0 - time()
					'args'          => array(), // какие параметры передать в фукнцию крон-задачи
					'callback'      => [ __CLASS__, 'default_callback' ], // название функции крон-задачи
					'interval_name' => '',      // 'half_an_hover' можно указать уже имеющийся интервал: hourly, twicedaily, daily
					'interval_sec'  => 0,       // HOUR_IN_SECONDS / 2 (не нужно указывать, если задан уже имеющийся интервал)
					'interval_desc' => '',      // 'Каждые пол часа' (не нужно указывать, если задан уже имеющийся интервал)
				],
			],
		];

		$event_def = $args_def['events']['hook_name'];
		unset( $args_def['events'] );

		// дополним параметами класса по умолчанию
		$args = array_merge( $args_def, $args );
		foreach( $args['events'] as & $events )
			$events = array_merge( $event_def, $events );
		unset( $events );

		$args = (object) $args;

		if( ! $this->id = $args->id )
			wp_die( 'ERROR: Kama_Cron wrong init: id not set. '. print_r($args, 1) );

		self::$opts[ $this->id ] = $args;

		// after 'self::$opts' set
		add_filter( 'cron_schedules', [ $this, 'add_intervals' ] );

		// after 'cron_schedules'
		if( !empty($args->auto_activate) && is_admin() )
			self::activate( $this->id );

		foreach( $args->events as $hook => $data )
			add_action( $hook, $data['callback'] );

		if( self::$DEBUG && defined('DOING_CRON') && DOING_CRON ){
			add_action( 'wp_loaded', function(){
				echo 'Current time: '. time() ."\n\n\n".'Existing Intervals:'."\n". print_r( wp_get_schedules(), 1 ) ."\n\n\n". print_r( _get_cron_array(), 1 );
			} );
		}

	}

	function add_intervals( $schedules ){
		foreach( self::$opts[ $this->id ]->events as $hook => $data ){
			if( ! $data['interval_sec'] || isset($schedules[ $data['interval_name'] ]) )
				continue;

			$schedules[ $data['interval_name'] ] = array(
				'interval' => $data['interval_sec'],
				'display'  => $data['interval_desc'],
			);
		}

		return $schedules;
	}

	## Добавляет крон задачу.
	## Вызывается при активации плагина, можно гдето еще например на обновлении настроек.
	static function activate( $id = '' ){
		$opts = $id ? array($id => self::$opts[ $id ]) : self::$opts;

		foreach( $opts as $opt ){
			foreach( $opt->events as $hook => $data ){
				if( ! wp_next_scheduled( $hook, $data['args'] ) ){
					wp_schedule_event( ( $data['start_time'] ?: time() ), $data['interval_name'], $hook, $data['args'] );
				}
			}
		}
	}

	## Удаляет крон задачу.
	## Вызывается при дезактивации плагина.
	static function deactivate( $id = '' ){
		$opts = $id ? array($id => self::$opts[ $id ]) : self::$opts;

		foreach( $opts as $opt ){
			foreach( $opt->events as $hook => $data )
				wp_clear_scheduled_hook( $hook, $data['args'] );
		}
	}

	### Функция по умолчанию для параметра $data['callback']
	static function default_callback(){
		echo "ERROR: One of Kama_Cron callback function not set.\n\nKama_Cron::\$opts - ". print_r(self::$opts, 1) ."\n\n\n\n". print_r( _get_cron_array(), 1 );
	}

}

Примеры использования класса Kama_Cron

Для начала, скопируйте код класса и вставьте его в плагин или functions.php темы.

Пример 1: Инициализация класса

Создадим 3 крон задачи с разными интервалами. Задачи регистрируются автоматически при посещении админ-панели (это работает очень быстро). Код добавляем куда угодно, например в functions.php.

new Kama_Cron([
	'id'     => 'my_cron_jobs', // не обязательный параметр
	'events' => array(
		// первая задача
		'wpkama_cron_func' => array(
			'callback'      => 'wpkama_cron_func', // название функции крон-задачи
			'interval_name' => '10_min',           // можно указать уже имеющийся интервал: hourly, twicedaily, daily
			'interval_sec'  => 10 * 60,            // не нужен, если задан уже имеющийся интервал
			'interval_desc' => 'Каждые 10 минут',  // не нужен, если задан уже имеющийся интервал
		),
		// вторая задача
		'wpkama_cron_func_2' => array(
			'callback'      => 'wpkama_cron_func_2',
			'start_time'    => time() + DAY_IN_SECONDS, // начать через 1 день
			'interval_name' => 'two_hours',
			'interval_sec'  => HOUR_IN_SECONDS * 2,
			'interval_desc' => 'Каждые 2 часа',
		),
		// третья задача
		'wpkama_cron_func_3' => array(
			'callback'      => 'wpkama_cron_func_3',
			'interval_name' => 'hourly', // это уже известный WP интервал
		),
	),
]);
//Kama_Cron::$DEBUG = 1;                 // для дебага
//Kama_Cron::deactivate('my_cron_jobs'); // для удаления

// Функция для крона
function wpkama_cron_func(){
	file_put_contents( dirname(ABSPATH) .'/cron_check.txt', current_time('mysql') ."\n", FILE_APPEND );
}

function wpkama_cron_func_2(){
	// операции
}

function wpkama_cron_func_3(){
	// операции
}

Пример 2: Регистрирует задачи при активации плагина

При деактивации плагина задачи будут удалены (деактивированы).

// Пример активации и деактивации, если не указан параметр auto_activate
register_activation_hook( __FILE__, function(){
	Kama_Cron::activation( 'my_cron_jobs_2' );
} );

register_deactivation_hook( __FILE__, function(){
	Kama_Cron::deactivation( 'my_cron_jobs_2' );
} );

new Kama_Cron([
	'id'     => 'my_cron_jobs_2',
	'auto_activate' => false, // false чтобы повесить активацию задач на register_activation_hook()
	'events' => array(
		// первая задача
		'wpkama_cron_func_4' => array(
			'callback'      => 'wpkama_cron_func_4', // название функции крон-задачи
			'interval_name' => 'twicedaily', // можно указать уже имеющийся интервал: hourly, twicedaily, daily
		),
		// вторая задача
		'wpkama_cron_func_5' => array(
			'callback'      => 'wpkama_cron_func_5',
			'interval_name' => 'two_hours',
			'interval_sec'  => HOUR_IN_SECONDS * 2,
			'interval_desc' => 'Каждые 2 часа',
		),
	),
]);

function wpkama_cron_func_4(){
	// операции
}

function wpkama_cron_func_5(){
	// операции
}