WordPress как на ладони
Новые WordPress шаблоны Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

wp_schedule_event() WP 2.1

Создает многоразовую крон-задачу. Устанавливает хук, который будет вызываться каждый раз через указанный интервал времени.

Проверка о необходимости выполнения запланированного действия будет происходить каждый раз, как кто-либо посетит сайт.

Чтобы удалить имеющееся событие используйте wp_clear_scheduled_hook()

Является основой для: wp_reschedule_event()
Хуки из функции:
Возвращает

nul/false. null когда планирование завершено. false в случае неудачи.

Использование

wp_schedule_event( $timestamp, $recurrence, $hook, $args );
$timestamp(число) (обязательный)

Начальная метка времени, с которой хук начнет работать. Нужно указывать в формате UNIX (32165487).

WP cron использует время UTC/GMT, а не локальное. Используйте функцию time(), которая всегда в GMT в WP. current_time('timestamp') - это локальное время в WP.
По умолчанию: нет

$recurrence(строка) (обязательный)

Как часто должно повторяться действие. Допустимые значения ниже. Вы можете создать свой интервал используя фильтр cron_schedules из функции wp_get_schedules().

  • hourly - ежечасно;
  • twicedaily - дважды в день;
  • daily - ежедневно.

По умолчанию: нет

$hook(строка) (обязательный)
Название хука, который нужно выполнять.
По умолчанию: нет
$args(массив)
Аргументы, которые нужно передать в выполняемый хук.
По умолчанию: нет

Примеры

#1 Создаем крон задачу при активации плагина

Запланируем ежечасное действие для плагина. Для этого вызовем wp_schedule_event() при активации плагина (если делать не при активации, то мы получим множество запланированных событий!).

register_activation_hook(__FILE__, 'my_activation');
function my_activation() {
	// удалим на всякий случай все такие же задачи cron, чтобы добавить новые с "чистого листа"
	// это может понадобиться, если до этого подключалась такая же задача неправильно (без проверки что она уже есть)
	wp_clear_scheduled_hook( 'my_hourly_event' );

	// Проверим нет ли уже задачи с таким же хуком
	// этот пункт не нужен, потому что мы выше удалил все задачи...
	// if( ! wp_next_scheduled( 'my_hourly_event' ) ) 

	// добавим новую cron задачу
	wp_schedule_event( time(), 'hourly', 'my_hourly_event');
}

// Будет грамотно проверить выполняется ли крон, если нет - ничего не делаем
// Можно не проводить эту проверку, в принципе
if( defined('DOING_CRON') && DOING_CRON ){
	add_action('my_hourly_event', 'do_this_hourly');
	function do_this_hourly() {
		// делаем что-либо каждый час
	}
}

// При дезактивации плагина или в других случаях, обязательно нужно удалить ранее созданную задачу:
register_deactivation_hook( __FILE__, 'my_deactivation');
function my_deactivation() {
	wp_clear_scheduled_hook('my_hourly_event');
}

#2 Создаем крон задачу если её еще нет

Этот пример не полагается на активацию плагина (через директорию плагинов), вместо этого он добавляет событие, если его не существует:

// добавляем запланированный хук
add_action( 'wp', 'my_activation' );
function my_activation() {
	if( ! wp_next_scheduled( 'my_hourly_event' ) ) {
		wp_schedule_event( time(), 'hourly', 'my_hourly_event');
	}
}

// добавляем функцию к указанному хуку
add_action( 'my_hourly_event', 'do_this_hourly' );
function do_this_hourly() {
	// делаем что-либо каждый час
}

Удаляется задача так:

wp_clear_scheduled_hook( 'my_hourly_event' );

Так удаляться все задачи с указанным названием хука. Их может быть несколько, если неправильно их регистрировать.

#3 Добавление нового интервала

Чтобы добавить новый интервал Cron в WordPress, используем фильтр cron_schedules.

Добавим интервал «5 минут» (делать что-либо каждые 5 минут):

// регистрируем 5минутный интервал
add_filter( 'cron_schedules', 'cron_add_five_min' );
function cron_add_five_min( $schedules ) {
	$schedules['five_min'] = array(
		'interval' => 60 * 5,
		'display' => 'Раз в 5 минут'
	);
	return $schedules;
}

// регистрируем событие
add_action( 'wp', 'my_activation' );
function my_activation() {
	if ( ! wp_next_scheduled( 'my_five_min_event' ) ) {
		wp_schedule_event( time(), 'five_min', 'my_five_min_event');
	}
}
// добавляем функцию к указанному хуку
add_action( 'my_five_min_event', 'do_every_five_min' );
function do_every_five_min() {
	// делаем что-либо каждые 5 минут
}

Константы WordPress, которые могут пригодится при создании крон интервала:

  • HOUR_IN_SECONDS - час в секундах - 60*60 = 3600
  • DAY_IN_SECONDS - день в секундах - 60*60*24 = 86400
  • WEEK_IN_SECONDS - неделя в секундах - 60*60*24*7 = 604800

#4 Еще пример создания крон задачи (рабочий пример)

Что делает пример: получает курс рубля по отношению к доллару и записывает результат в опции. Делается это всего 2 раза в сутки, для чего собственно и нужен крон. Далее, где нужно данные можно очень быстро получить из опции, куда они были записаны.

Получение данных валют работает на основе библиотеки PHP Simple HTML DOM Parse

// Cron
// Регистрируем расписание при активации плагина
register_activation_hook(__FILE__, 'activation_geting_course_dollar');
function activation_geting_course_dollar() {
	wp_clear_scheduled_hook( 'geting_course_dollar' );
	wp_schedule_event( time(), 'twicedaily', 'geting_course_dollar');
}

// Удаляем расписание при деактивации плагина
register_deactivation_hook( __FILE__, 'deactivation_geting_course_dollar');
function deactivation_geting_course_dollar() {
	wp_clear_scheduled_hook('geting_course_dollar');
}

// Проверка существования расписания во время работы плагина на всякий пожарный случай
if( ! wp_next_scheduled( 'geting_course_dollar' ) ) {  
	wp_schedule_event( time(), 'twicedaily', 'geting_course_dollar');  
}

// Хук и функция, которая будет выполняться по Крону
add_action( 'geting_course_dollar', 'get_real_course_dollar' );  
function get_real_course_dollar(){
	include 'inc/simple_html_dom.php';
	$html = file_get_html( 'https://news.yandex.ru/quotes/1.html' );
	$value = $html->find('.quote_current_yes', 0)->find('.quote__value',0)->plaintext;
	$date = $html->find('.quote_current_yes', 0)->find('.quote__date',0)->plaintext;
	$course = array( 'dollar' => $value, 'date' => $date, 'check' => current_time('mysql',1) );
	update_option( 'i_price_course_dollar', $course, 'no' );
}

// Выводит данные курса
function the_course_dollar( $data = null ){
	echo get_course_dollar( $data );
}

// Возвращает данные курса
function get_course_dollar( $data = null ){
	$course = get_option('i_price_course_dollar');
	if ( !$data || $data == 'dollar') return $course['dollar'];
	if ( $data == 'date') return $course['date'];
	if ( $data == 'check') return $course['check'];
}

#5 Обновление еще не выполненной крон задачи

Допустим у нас в плагине есть настройка интервала какой-то крон задачи. И нам нужно, обновлять интервал задачи в зависимости от указанной настройки.

Первое что нужно сделать это удалить текущую задачу и добавить новую. Также нужно учесть изменение настройки при изменении интервала для крон задачи.

Этот пример показывает как сделать такую операцию с плагином ACF. При обновлении опции которого нужно обновить крон задачу.

// функция выполнения крон задачи 'rs_cron_event'
add_action('rs_cron_event', 'rs_cron_rebuild_meta_products');
function rs_cron_rebuild_meta_products() {
	// выполняем задачу крон
	$headers = 'From: My Name <myname@mydomain.com>' . "\r\n";
	wp_mail('test@test.com', 'Тема', 'Содержание', $headers );
}

// добавим наш новый интервал для крона
add_filter( 'cron_schedules', 'rs_cron_interval');
function rs_cron_interval( $schedules, $value = '' ){
	// чтобы можно было указать значение жестко
	if( ! $value )
		$value = intval( get_option('options_rs_time_period') ?: 12 );

	$schedules['rs_time_period'] = array(
		'interval' => $value * HOUR_IN_SECONDS ,
		'display' => 'Задаётся в настройках плагина RS'
	);    

	return $schedules;
}

// Функция обновления поля
add_filter('acf/update_value/name=rs_time_period', 'my_acf_update_value', 10, 3);
function my_acf_update_value( $new_period, $post_id, $field  ) {

	$old_period = get_option('options_rs_time_period');

	// опция изменилась, перезапишем крон задачу с новой настройкой!
	if( $new_period != $old_period ){
		// удалим имеющуюся крон задачу
		$timestamp = wp_next_scheduled('rs_cron_event');
		wp_unschedule_event( $timestamp, 'rs_cron_event');

		// изменим интервал чтобы задача добавилось правильно...
		add_filter( 'cron_schedules', function( $schedules ) use ( $new_period ){
			return rs_cron_interval( $schedules, $new_period ); // костылёк жестко укажем интервал
		} );

		// добавим крон задача снова
		wp_reschedule_event( time(), 'rs_time_period', 'rs_cron_event' );
	}

	return $new_period;
}

#6 Класс для удобного добавления крон событий

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

Код класса:

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

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

	protected $id;

	function __construct( $args ){

		$args_example = [
			'id' => '', // уникальный идентификатор по которому потом можно обращаться к настройкам

			'auto_activate' => false, // 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' => '',      // 'Каждые пол часа' (не нужно указывать, если задан уже имеющийся интервал)
				],
			],
		];

		// дополним параметами класса по умолчанию
		foreach( $args['events'] as & $events ){
			$events = array_merge( $args_example['events']['hook_name'], $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 );
	}

}

Инициализация класса. Добавляем код куда-нибудь в functions.php.

new Kama_Cron([
	'id'            => 'my_cron_jobs',
	'auto_activate' => true, // false (или удалить) чтобы повесить активацию задачи на register_activation_hook()
	'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', // это уже известный ВП интервал
		),
	),
]);
//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(){
	// операции
}

Еще один вызов класса с другими задачами и активацией через хуки для плагина:

// Пример активации и деактивации, если не указан параметр 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',
	'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(){
	// операции
}

Код wp_schedule_event: wp-includes/cron.php VER 4.9.8

<?php
function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) {
	// Make sure timestamp is a positive integer
	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
		return false;
	}

	$crons = _get_cron_array();
	$schedules = wp_get_schedules();

	if ( !isset( $schedules[$recurrence] ) )
		return false;

	$event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
	/** This filter is documented in wp-includes/cron.php */
	$event = apply_filters( 'schedule_event', $event );

	// A plugin disallowed this event
	if ( ! $event )
		return false;

	$key = md5(serialize($event->args));

	$crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval );
	uksort( $crons, "strnatcasecmp" );
	_set_cron_array( $crons );
}

Cвязанные функции

Из метки: cron (расписание schedule)

28 комментов
Полезные 4 Вопросы 1 Все
  • @ Lev cайт: mosthealthyrecipes.tk

    Здравстуйте, а если я хочу генерировать карту раз в неделю, то можно ли указать weekly ?

    Ответить5.3 лет назад #
  • @ Покорный ученик cайт: wp-admin.com.ua

    Как сделать интервал в 5 минут для этой функции?

    Ответить3.7 года назад #
    • @ campusboy3060 cайт: www.youtube.com/c/wpplus

      В статье же написано:

      Вы можете создать свой интервал используя фильтр cron_schedules из функции wp_get_schedules().

      Ответить3.7 года назад #
    • Kama7019

      Второй пример из описания wp_get_schedules():

      #2. Пример добавления нового интервала для плагина.

      Чтобы добавить новый интервал для Cron в WordPress мы можем использовать фильтр cron_schedules.

      Добавим интервал повторения события: раз в 5 минут:

      // регистрируем пятиминутный интервал
      add_filter( 'cron_schedules', 'cron_add_five_min' );
      function cron_add_five_min( $schedules ) {
      	$schedules['five_min'] = array(
      		'interval' => 60 * 5,
      		'display' => 'Раз в 5 минут'
      	);
      	return $schedules;
      }
      
      // регистрируем событие
      add_action('wp', 'my_activation');
      function my_activation() {
      	if ( ! wp_next_scheduled( 'my_five_min_event' ) ) {
      		wp_schedule_event( time(), 'five_min', 'my_five_min_event');
      	}
      }
      // добавляем функцию к указанному хуку
      add_action('my_five_min_event', 'do_every_five_min');
      function do_every_five_min() {
      	// делаем что-либо каждые 5 минут
      }
      1
      Ответить3.7 года назад #
      • @ Макс cайт: wp-admin.com.ua

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

        п.с. Спасибо за пример.

        Ответить3.6 года назад #
  • @ campusboy3060 cайт: www.youtube.com/c/wpplus

    Честно сказать так и не понял, как сделать всё с самого начала и до конца. К примеру, хочу с Яндекса парсить курс доллара. Чтобы это не делать при каждой загрузки страницы, хочется просто раз в полдня тянуть данные и в базу сливать. Функции по парсингу и так далее есть, не могу понять, как прикрутить их к расписанию sad

    1
    Ответить2.4 года назад #
    • @ campusboy3060 cайт: www.youtube.com/c/wpplus

      Нашёл мануал более понятный, сделал, вроде работает. Единственная функция, о работоспособности которой можно сказать "Время покажет" laugh Итак, мой пример получает курс рубля по отношению к доллару:

      // Cron
      // Регистрируем расписание при активации плагина
      register_activation_hook(__FILE__, 'activation_geting_course_dollar');
      function activation_geting_course_dollar() {
      	wp_clear_scheduled_hook( 'geting_course_dollar' );
      	wp_schedule_event( time(), 'twicedaily', 'geting_course_dollar');
      }
      
      // Удаляем расписание при деактивации плагина
      register_deactivation_hook( __FILE__, 'deactivation_geting_course_dollar');
      function deactivation_geting_course_dollar() {
      	wp_clear_scheduled_hook('geting_course_dollar');
      }
      
      // Проверка существования расписания во время работы плагина на всякий пожарный случай
      if( ! wp_next_scheduled( 'geting_course_dollar' ) ) {  
      	wp_schedule_event( time(), 'twicedaily', 'geting_course_dollar');  
      }
      
      // Хук и функция, которая будет выполняться по Крону
      add_action( 'geting_course_dollar', 'get_real_course_dollar' );  
      function get_real_course_dollar(){
      	include 'inc/simple_html_dom.php';
      	$html = file_get_html( 'https://news.yandex.ru/quotes/1.html' );
      	$value = $html->find('.quote_current_yes', 0)->find('.quote__value',0)->plaintext;
      	$date = $html->find('.quote_current_yes', 0)->find('.quote__date',0)->plaintext;
      	$course = array( 'dollar' => $value, 'date' => $date, 'check' => current_time('mysql',1) );
      	update_option( 'i_price_course_dollar', $course, 'no' );
      }
      
      // Выводит данные курса
      function the_course_dollar( $data = null ){
      	echo get_course_dollar( $data );
      }
      
      // Возвращает данные курса
      function get_course_dollar( $data = null ){
      	$course = get_option('i_price_course_dollar');
      	if ( !$data || $data == 'dollar') return $course['dollar'];
      	if ( $data == 'date') return $course['date'];
      	if ( $data == 'check') return $course['check'];
      }

      Вывод в шаблоне:

      По состоянию на <?php the_course_dollar('date'); ?> курс 1 доллара = <?php the_course_dollar('dollar'); ?> руб. Курс проверялся <?php the_course_dollar('check'); ?>
      2
      Ответить2.4 года назад #
      • @ campusboy3060 cайт: www.youtube.com/c/wpplus

        Я ещё сюда шорткоды понаделал для удобства использования, но прикреплять не стал, потому что шорткоды создаются элементарно.

        1
        Ответить2.4 года назад #
      • Kama7019

        Спасибо за комментарий, бегло просмотрел код, вроде все хорошо. Пожалуй добавлю этот код в примеры, если ты не против. Он немного отличается от того что есть и полный, а еще как я понял ты его проверил в реальных условиях.

        Ответить2.4 года назад #
        • @ campusboy3060 cайт: www.youtube.com/c/wpplus

          Конечно, я не против smile Надо только учесть, что я использовал специальный парсер PHP Simple HTML DOM Parse , то есть без него этот скрипт несамодостаточен. В коде видно, как я его include по самые помидоры. Не охота было самому регулярки писать, да и не увидел в этом смысла. Кстати, туда можно вставить и другую ссылку того же Яндекса (даже если домен UA), только где отображается курс гривны и всё будет работать.

          Ответить2.4 года назад #
          • Kama7019

            И это добавил, спасибо!

            Ответить2.4 года назад #
            • @ campusboy3060 cайт: www.youtube.com/c/wpplus

              Спасибо за указание авторства, но это было не обязательно smile
              Хотел бы сделать замечание по этому коду. Строки:

              $value = $html->find('.quote_current_yes', 0)->find('.quote__value',0)->plaintext;
              	$date = $html->find('.quote_current_yes', 0)->find('.quote__date',0)->plaintext;

              Отвечают за подгрузку значений на сегодняшний день. Проблема (а может и не проблема, кому как), что, анализировал Яндекс, это значение на выходных не менялось, то есть 3 дня был один и тот же курс, потому строки с классом ".quote_current_yes" не было и я думал, что скрипт не работает. Но всё нормально, он просто его не находит и ничего не делает. Конечно, можно всё это доработать при надобности, парсер позволяет многое, а логика в программировании тем более smile Единственное, что мне не поправилось в Яндексе, что он отображает прогноз на завтра, но класс tr какой-то определенный не присваивает, как это сделано со строкой курса на сегодня. Конечно, можно брать 1 tr и использовать в своих целях, но снова проблема: не всегда отображается курс на завтра. В общем, это были мысли в слух и небольшой план действий для тех, кому надо доработать плагин под такие нужны. А можно попробовать другие места, откуда можно парсить данные, к примеру с национального банка своей страны. Я так и хотел сделать, но почему-то Яндекс мне приглянулся больше.

              Ответить2.4 года назад #
  • Yuriy

    здравствуйте!
    а допустим нужно ночью выключать сайт, а утром включать? что посоветуете - ставить в крон 2 события - активацию режима разработки и потом деактивацию? спасибо

    Ответить2.4 года назад #
    • Kama7019

      Зачем крон, просто время проверяйте и делайте что нужно. Для получения текущего времени сайта, используйте current_time()

      1
      Ответить2.4 года назад #
  • wp-cron.php

    А кто вызывает сам wp-cron.php? Или вп сам себя кронит?

    Ответить2.4 года назад #
    • @ campusboy3060 cайт: www.youtube.com/c/wpplus

      Когда человек заходит на сайт, тогда движок пробегается по расписанию и выполняет задания. Если у Вас малопосещаемый проект, то точности не ждите. Чтобы было всё точно, как в аптеке, настройте дополнительно Cron на самом хостинге, пусть он с нужным интервалом долбит в wp-cron.php (можно, в принципе, любую страницу сайта долбить, правда если он кеширован не знаю как будет отрабатывать, но wp-cron.php самый надежный вариант).

      2
      Ответить2.4 года назад #
    • Kama7019

      WP сам себя, при заходах пользователей. Если нужен точный крон, то можно вызывать напрямую крон ВП из крона сервера, просто обращаясь к ссылке http://site.ru/wp-cron.php. Серверный крон работает постоянно и можно кронить вплоть до минут...

      1
      Ответить2.4 года назад #
  • Я правильно понимаю, что если настроить событие с интервалом в минуту, но отключить крон в config.php и настроить crontab на сервере раз в 15 минут, то событие будет выполнятся 1 раз в 15 минут?

    Ответить1.7 год назад #
    • Kama7019

      Да так и есть... Раз в минуту такой крон ставить совсем не оптимально, лучше придумать другую логику где запускать крон хотя бы раз в 5 минут. Выключать крон в конфиге крайне не рекомендую, там многое на нем завязано... Лучше подстроиться под родной крон...

      Ответить1.7 год назад #
      • Как же мне подстроится под родной крон, если он срабатывает только при посещении, а мне нужно чётко раз в 15 минут проверять скрипт. И на родной крон завязано всего 4 события, как я проверил и все они касаются только проверки апдейтов, удалений драфтов и публикаций отложенных постов.

        Вопрос был в том, что если я укажу в скрипте выполнение задания раз в 5 минут (для страховки), а в кронтабе 15 минут - не будет ли пытаться вп выполнить скрипт 3 раза, считая, что пропустил 3 итерации вместо одной? Хотя скрипт я уже протестил и, вроде, нет.

        Так же меня интересует вот что: чем удобен крон вп, если в таких случаях, как мой, можно было бы использовать просто прямое обращение к скрипту по wget или curl?

        Ответить1.7 год назад #
        • Kama7019

          Как же мне подстроится под родной крон, если он срабатывает только при посещении

          Настрой посещение файла /wp-cron.php (в корне движка) каждые 15 минут и не надо его отключать!

          не будет ли пытаться вп выполнить скрипт 3 раза, считая, что пропустил 3 итерации вместо одной?

          Нет такого не будет!

          чем удобен крон вп, если в таких случаях, как мой, можно было бы использовать просто прямое обращение к скрипту по wget или curl?

          Ничем... Суть его в том, чтобы дать возможность плагинам делать что-либо. Чтобы можно было точно найти файл крона для плагинов это важно ибо серверов со своими настройками куча. Также - это какая-то единая логика использования крон... Если у тебя частный случай и ты знаешь как сделать нужные тебе дела и кроном вп пользоваться не особо хочешь, то я думаю и не надо...

          Но все же крон удобнее, хотя бы потому что ты можешь поставить плагин и посмотреть в админке вп все задачи, отключить, понять что-то и т.д. Для произвольно скрипта такие вещи нужно будет писать самому... Произвольный скрипт может затеряться и например другой владелец знать о нем ничего не будет, заглянет в крон а там нет ничего... Как-то так...

          Ответить1.7 год назад #
  • Владимир

    Не хвататет константы MINUTE_IN_SECONDS = 60 секунд

    Ответить1.7 год назад #
    • Kama7019

      Я спец не написал, тут в проще просто написать 60 чем MINUTE_IN_SECONDS... unknw

      Ответить1.7 год назад #
  • Явер4 cайт: master-gimp.ru

    Добрый день. Интересует вопрос относительно $timestamp. Допустим, я хочу отправлять емаил в определенное время относительно своего часового пояса.
    Как установить, например отправку в 12.00 по Москве?
    Не совсем понимаю работу времени относительно часовых поясов. Спасибо.

    Я имею в виду реализацию такой задачи. Допустим мне нужно отправить e-mail в 12.00 по Москве каждый день 1 раз. Как задать зависимость от часового пояса?

    Ответить1.5 год назад #
    • Kama7019

      Хороший вопрос... Я не знаю точного ответа на него... Но судя по всему, тебе нужно найти UTC время равное 12 часам для Москвы с учетом сдвижки. И добавить первую задачу на это время. А дальше уже просто включить интервал каждые 24 часа...

      У Москвы GMT+3 а значит:

      //echo mktime( $hour, $min, $sec, $month, $day, $year );
      // ближайшее время начала события от текущего
      $unixstamp = mktime( 12, 0, 0, 04, 13, 2017 ); //> 1500984000
      $fix       = HOUR_IN_SECONDS * 3; // +3 часа для Москвы
      
      $moscow_stamp = $unixstamp - $fix; // уберем 3 часа
      
      // используй $moscow_stamp как стартовую точку для начала первого события...
      

      После тестов отпишись плз...

      Ответить1.5 год назад #
  • Я конечно могу ошибаться, но в константах по-моему ошибка. В году 60 x 60 x 24 x 365
    = 31 536 000 секунд. Там зачем-то умножение на 7 затесалось.

    2
    Ответить4 месяца назад #
  • @ Наталья

    Добрый день!

    1. А можно ли задать интервал к примеру - каждое воскресенье?
    2. Можно ли задать выполнение задачи по каким-то заданным числам (скажем по разным праздникам) на весь год вперёд?
    Ответить3 месяца назад #
Здравствуйте, !     Войти . Зарегистрироваться