WordPress как на ладони
Готовые темы (шаблоны) для WordPress wordpress jino

wp_schedule_event() WP 2.1

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

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

Крон задачи выполняются асинхронно. Т.е. для выполнения ожидаемых крон задач, WordPress отправляет запрос на файл http://site.ru/wp-cron.php. Этот файл самодостаточный: он устанавливает константу define('DOING_CRON', true);, затем подгружает среду WordPress и выполняет все ожидаемые задачи. Поэтому для дебага крон функции нужно напрямую обращаться к файлу http://site.ru/wp-cron.php. (см. пункт "дебаг крона").

При отправке запроса в файл http://site.ru/wp-cron.php и выполнении очередной задачи WordPress автоматический добавляет новую задачу в планировщик и удаляет текущую, используя при этом: wp_reschedule_event(), wp_unschedule_event().

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

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

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

Зачем нужно событие cron_schedules. Казалось бы почему просто не указать интервал при добавлении задачи и все, зачем нужно добавлять интервал через фильтр, чтобы потом wp_schedule_event() использовал этот фильтр. Дело в том, что интервал должен существовать всегда. При выполнении одной крон задачи, WP на основе этого интервала создает такое же следующее задание. И поэтому ему нужны данные интервала...

Используется в: 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(массив)
Аргументы, которые нужно передать в выполняемый хук.
По умолчанию: нет
к началу

Дебаг Крона в WordPress

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

Крон задачи выполняются асинхронно и поэтому при загрузке страниц сайта вы не увидите ничего, даже если в функции крона выведите что-то на экран, пр: die('вижу').

Чтобы увидеть возможные ошибки, нужно поставить интервал поменьше и открыть файл http://site.ru/wp-cron.php. Обращаясь к этому файлу, вы увидите что возвращают ваши функции, если наступило время их выполнения. В том числе вы сможете увидеть PHP ошибки (включите константу WP_DEBUG в wp-config.php).

Если нужно, чтобы автоматические задачи временно не восполнялись пока вы "дебагите" новую функцию, то в файле /wp-config.php установите константу

define('DISABLE_WP_CRON', true);

Также, для дебага может понадобится получить весь список активных Крон событий, сделать это можно так:

print_r( _get_cron_array() );
к началу

Примеры

#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. Многоразовый вызов wp_schedule_event()

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

// добавляем запланированный хук
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 минут:

// регистрируем пятиминутный интервал
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 минут
}
к началу

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

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

/**
 * Удобное добавление крон задач. Код нужно вызывать как можно раньше, без всяких хуков.
 * Для добавления задачи: Kama_Cron::activation() при активации плагина, и можно при обновлении настроек.
 * Для удаления задач: Kama_Cron::deactivation() при деактивации плагина.
 *
 * Внимание: этот код должен подключаться как плагин или должен быть в главном файле плагина.
 * При несоблюдении этого условия, обратите внимание на вызов двух функций:
 * register_activation_hook() и register_deactivation_hook()
 * 
 * ver 0.1
 */

## Инициализация с настройками
new Kama_Cron(array(
	'id' => 'mycron', // уникальный идентификатор по которому потом можно обращаться к настройкам

	// Какие задачи добавить
	'events' => array(
		// hook name => $data
		'sdot_close_overdue_draft' => array(
			'interval_key'  => 'half_an_hover',
			'interval_name' => 'Каждые пол часа',
			'interval'      => HOUR_IN_SECONDS/2,
			'event_name'    => 'Закончить незавершенные тесты',
			'method'        => 'close_overdue_draft', // название метода класса Kama_Cron, или название внешней функции
			'args'          => array(),
		),
		// для разработки
		'sdot_close_overdue_draft2' => array(
			'interval_key'  => 'minute',
			'interval_name' => 'Каждую минуту',
			'interval'      => 60,
			'event_name'    => 'Закончить незавершенные тесты',
			'method'        => 'my_func_for_cron_exec',
			'args'          => array(),
			'start_time'    => 0, // 0 - now
		),
	),

	// Какие задачи удалить, если вдруг в результате разработки появились лишние
	'clear' => array(
		//'hook_name' => array( 'args' => array() ),
	),
));

// Внешняя функцию крон указанная в настройках класса Kama_Cron
function my_func_for_cron_exec(){
	if( Kama_Cron::DEBUG )
		die( '<br><br>next '. date('d M Y H:i', wp_next_scheduled('sdot_close_overdue_draft') ) . ' and now ' . date('d M Y H:i') );

	// здесь любой код, который должен выполниться по расписанию
}

register_activation_hook( __FILE__, array('Kama_Cron','activation') ); // активация для плагина

register_deactivation_hook( __FILE__, array('Kama_Cron','deactivation') ); // деактивация для плагина

/**
 * Класс Kama_Cron
 * ver see parent
 */
class Kama_Cron {

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

	static $opts;

	public $id;

	function __construct( $args ){
		$opt_def = array(
			'id'    => '', // уникальный идентификатор по которому потом можно обращаться к настройкам

			// Какие задачи добавить
			'events' => array(
				// hook name => $data
				'sdot_close_overdue_draft' => array(
					'interval_key'  => 'half_an_hover',
					'interval_name' => 'Каждые пол часа',
					'interval'      => HOUR_IN_SECONDS/2,
					'event_name'    => 'Закончить незавершенные тесты',
					'method'        => 'close_overdue_draft', // название метода класса Kama_Cron, или название внешней функции
					'args'          => array(),
				),
			),

			// Какие задачи удалить, если вдруг в результате разработки появились лишние
			'clear' => array(
				//'hook_name' => array( 'args' => array() ),
			),
		);

		$opt = (object) array_merge( $opt_def, $args );

		if( ! $this->id = $opt->id ) wp_die('ID не указан при создании экземпляра Kama_Cron');

		self::$opt[$this->id] = $opt;

		add_filter( 'cron_schedules', array( & $this, 'add_intervals' ) );

		if( defined('DOING_CRON') && DOING_CRON ){
			foreach( self::$opt[$this->id]->events as $key => $data ){
				if( method_exists( $this, $data['method'] ) ) $func = array( & $this, $data['method'] );
				elseif( function_exists( $data['method'] ) )  $func = $data['method'];

				if( isset($func) )
					add_action( $key, $func );
			}
		}

		if( Kama_Cron::DEBUG )
			echo print_r( _get_cron_array(), 1 ) . '<br><br>now time - '. time();
	}

	## Доп. интервалы, чтобы регнуть задачу
	function add_intervals( $schedules ){
		foreach( self::$opt[$this->id]->events as $key => $data ){
			$schedules[ $data['interval_key'] ] = array(
				'interval' => $data['interval'],
				'display'  => $data['interval_name'],
			);
		}

		return $schedules;
	}

	## Добавляет крон задачу. Вызывается при активации плагина или на обновлении настроек
	static function activation(){
		self::deactivation(); // сначала удалим все задачи

		// теперь добавим
		foreach( self::$opts as $opt ){
			foreach( $opt->events as $key => $data )
				wp_schedule_event( (@ $data['start_time']?:time()), $data['interval_key'], $key );
		}
	}

	## Удаляет крон задачу. Вызывается при дезактивации плагина
	static function deactivation(){
		foreach( self::$opts as $opt ){
			// удалим задачи с таким же названием
			foreach( $opt->events as $key => $data ) wp_clear_scheduled_hook( $key, $data['args'] );

			// удалим произвольно указанные задачи не из класса...
			foreach( $opt->clear as $key => $data )  wp_clear_scheduled_hook( $key, $data['args'] );
		}
	}

	### Функции из параметра $data['method'] -----------------------------------------

	## Главная Функция - закрывает просроченные черновики
	function close_overdue_draft(){
		global $wpdb;

		if( Kama_Cron::DEBUG )
			die( '<br><br>next '. date('d M Y H:i', wp_next_scheduled('sdot_close_overdue_draft') ) . ' and now ' . date('d M Y H:i') );
	}

}

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

к началу

#5 Полный пример создания крон задачи

Это пример из комментариев от Campusboy, автора сайта wp-plus.ru, за что скажем ему отдельное спасибо!

Что делает пример: получает курс рубля по отношению к доллару и записывает результат в опции. Делается это всего 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'];
}
к началу

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

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

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

Этот пример показывает как сделать такую операцию с плагином 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;
}
к началу

Плагин для контроля Крон задач

Код wp schedule event: wp-includes/cron.php WP 4.7.5

<?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)

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

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

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

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

    Ответить2.3 года назад #
    • campusboy1455 cайт: wp-plus.ru
      @

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

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

      Ответить2.3 года назад #
    • Kama4349

      Второй пример из описания 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 минут
      }
      Ответить2.3 года назад #
      1
      • Макс cайт: wp-admin.com.ua
        @

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

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

        Ответить2.1 года назад #
  • Павел

    Здравствуйте)
    Из аз влюченного define('ALTERNATE_WP_CRON', true);
    Постоянно в ссылке сайта проявлется параметр
    ?doing_wp_cron=1455704356.0588181018829345703125

    Если отключить define('ALTERNATE_WP_CRON', false);
    то исчезает, но функции не будут работать.

    Как сделать так, чтобы и функции работали и параметра не было?

    Я так понимаю, define('ALTERNATE_WP_CRON', true); нужен если нет на сервере нстоящего крона или с чем то дургим связано?

    Ответить1.2 года назад #
  • campusboy1455 cайт: wp-plus.ru
    @

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

    Ответитьгод назад #
    1
    • campusboy1455 cайт: wp-plus.ru
      @

      Нашёл мануал более понятный, сделал, вроде работает. Единственная функция, о работоспособности которой можно сказать "Время покажет" 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
      • campusboy1455 cайт: wp-plus.ru
        @

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

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

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

        Ответитьгод назад #
        • campusboy1455 cайт: wp-plus.ru
          @

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

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

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

            Ответитьгод назад #
            • campusboy1455 cайт: wp-plus.ru
              @

              Спасибо за указание авторства, но это было не обязательно 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 и использовать в своих целях, но снова проблема: не всегда отображается курс на завтра. В общем, это были мысли в слух и небольшой план действий для тех, кому надо доработать плагин под такие нужны. А можно попробовать другие места, откуда можно парсить данные, к примеру с национального банка своей страны. Я так и хотел сделать, но почему-то Яндекс мне приглянулся больше.

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

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

    • Kama4349

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

      1
  • wp-cron.php

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

    • campusboy1455 cайт: wp-plus.ru
      @

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

      2
    • Kama4349

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

      1
  • Илья

    Здравствуйте.
    Есть ряд запланированных задач, у всех wp_schedule_event(time(),'daily','action_name')
    Подскажите, если стоит 'daily' - это значит, что все мои задачи будут выполнятся ежедневно и одновременно? Это не нагрузит сервер? Может быть можно как-то оставить расписание ежедневным, но чтоб одна задача выполнялась каждый день в полночь, другая - в полдень и т.д.
    Или вордпресс как-то сам разберется, и мне не стоит переживать по этому поводу? Спасибо.

  • @

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

    Ответить3 месяца назад #
    • Kama4349

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

      Ответить3 месяца назад #
      • @

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

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

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

        Ответить3 месяца назад #
        • Kama4349

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

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

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

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

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

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

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

          Ответить3 месяца назад #
          • @

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

            Т.е. даже если wget у меня работает каждые 15 минут, по файлу, мне не стоит отключать родной крон? Они не будут мешать друг другу?

            Ответить3 месяца назад #
  • Владимир

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

    Ответить3 месяца назад #
    • Kama4349

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

      Ответить3 месяца назад #
  • Явер cайт: master-gimp.ru

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

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

    Ответитьмесяц назад #
    • Kama4349

      Хороший вопрос... Я не знаю точного ответа на него... Но судя по всему, тебе нужно найти 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 как стартовую точку для начала первого события...
      

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

      Ответитьмесяц назад #

Здравствуйте, !

Ваш комментарий