WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

wp_cron() WP 2.1

Запускает все запланированные в Крон (cron) события.

При вызове этой функции, будут запущены все действия, которые были запланированы и время их запуска уже наступило.

Обычно эту функцию не нужно вызывать отдельно. Она вызывается автоматически когда нужно. Чтобы "повесить" событие на крон, используйте wp_schedule_event().

Если где-то определена константа DISABLE_WP_CRON, то функция ничего не запустит.

cron — название взято из UNIX-подобных операционных систем, где в задачи этого демон-планировщика задач входит: периодическое выполнение заданий в определённое время.

Хуков нет.

Возвращает

Ничего не возвращает.

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

<?php wp_cron() ?>

Примеры

#1. Пример, отправки сообщения ежечасно на email.

// включаем крон задачу, если она еще не включена. 
// Лучше это делать один раз при активации плагина, например
if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
	wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}

// добавляем крон хук
add_action( 'my_task_hook', 'my_task_function' );
function my_task_function() {
	wp_mail( 'your@email.com', 'Автоматическое письмо', 'Запланированное письмо от WordPress.');
}

Код можно поместить, например, в файл темы functions.php.

Код wp cron: wp-includes/cron.php WP 4.8

<?php
function wp_cron() {
	// Prevent infinite loops caused by lack of wp-cron.php
	if ( strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) )
		return;

	if ( false === $crons = _get_cron_array() )
		return;

	$gmt_time = microtime( true );
	$keys = array_keys( $crons );
	if ( isset($keys[0]) && $keys[0] > $gmt_time )
		return;

	$schedules = wp_get_schedules();
	foreach ( $crons as $timestamp => $cronhooks ) {
		if ( $timestamp > $gmt_time ) break;
		foreach ( (array) $cronhooks as $hook => $args ) {
			if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) )
				continue;
			spawn_cron( $gmt_time );
			break 2;
		}
	}
}

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

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

Еще из раздела: Планировщик задач (Cron)

wp_cron 20 комментариев
Полезные 1 Вопросы 1 Все
  • bowman

    Можно пояснить. Допустим у меня некоторый код в functions.php с функцией wp_schedule_event (...)
    Выполняться код будет только, eсли вызвать на какой-нибудь странице функцию wp_cron() .
    Все правильно?

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

      Не совсем, крон задачи выполняются в WordPress автоматически, если крон не отключен. Нет необходимости отдельно вызывать эту функцию, чтобы запланированные крон задачи выполнялись.

      Но вы правы, если вызвать эту функции, то будет насильно инициализрована крон работа.

      2
      Ответить2.7 года назад #
  • artem78

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

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

    Здравствуйте, Тимур! А как быть, если нужно не hourly а раз в 15 минут?
    Спасибо!

    1
    Ответить1.2 года назад #
    • Юра
      wp_schedule_single_event( time() + 900, 'my_new_event', array( 'some_arg' ) );
      Ответить1.2 года назад #
  • Олег cайт: amix24.com
    @

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

  • Михаил cайт: trapeznaya.ucoz.ru

    cron - это уязвимое место в wordpress - ссылка о ddos атаке через cron

    • Kama4457

      Бред какой-то там написан, про число какое-то статическое... Атаковать можно куда угодно: на файл комментов, файл аякса, да тупо в главную параметры запроса поставляй и погнали...

  • Явер

    Добрый день. Пытаюсь использовать wp-cron в файле, подключаемом через ajax. Но, к сожалению не работает.
    Если разместить код ниже в function.php, то все работает.

    function do_this_in_an_hour() {
    	wp_mail('my-email@gmail.com','Тема тестового письма','Тестовое сообщение');
    }
    add_action('my_new_event','do_this_in_an_hour' );
    wp_schedule_single_event( time() + 60, 'my_new_event' );
    

    Но, если этот же код разместить в подключаемом файле, то не работает. В чем причина?

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

      То есть, задача в список добавляется, но не срабатывает sad

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

        Что-то ты не то делаешь...

        Обрати внимание что wp_schedule_single_event() - это одиночное событие. Вызывать эту функцию, как и функцию wp_schedule_event() нужно всего одни раз! Обычно это делается при активации плагина, а при деактивации эти крон задачи удаляются...

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

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

        Крон запрос запускается отдельно от текущей инициализации скрипта, он отдельно запускается и в нем отдельно грузится среда ВП и т.д. Текущий запрос только вызывает запрос крона, если, вообще, время подошло...

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

          Получается, я не смогу навешать, например, на клик пользователем по кнопке, wp_schedule_single_event() ? Если так, то может есть какие-то обходные пути?

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

            В общем, хук добавил в function.php А в файл подключаемый через ajax добавил wp_schedule_single_event. Событие происходит, но несколько раз. А именно по числу посещений сайта с момента запуска запланированной задачи до её выполнения gamer2

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

              Ерунда какая-то sad
              перенес wp_schedule_single_event в function.php, задал условие:

              $per = $_POST['per'];
              
              if ( isset($per) ){
              
              	// Создаем массив
              	$post_data = array(
              		'post_title'    => 'Заголовок',
              		'post_content'  => 'Текст',
              		'post_status'   => 'publish',
              		'post_author'   => 999999,
              		'post_type'     => 'copy',
              	);
              	$post_id = wp_insert_post( wp_slash($post_data) );
              
              	function do_this_in_an_hour() {
              		wp_mail('email@gmail.com', 'Тема тестового письма', 'Тестовое сообщение');
              	}
              	add_action('my_new_event', 'do_this_in_an_hour' );
              	wp_schedule_single_event( time() + 30, 'my_new_event' );
              
              }

              Запись появляется, а событие не появляется sad

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

                Чет ты мутишь... Что нужно-то вообще?

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

                  Создать разовое событие при клике на кнопку пользователем.

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

                    А сразу при клике сделать что нужно нельзя, обязательно нужно отложить? Притом как я вижу по коду ты отклыдываешь на 30 секунд. В чем смысл?

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

                      Да, необходимо отложенное действие, так как сервис с которым будет взаимодействовать скрипт выдает результат не сразу, а через время.
                      Суть такая: Пользователь отправляет запрос. Сторонний сервис обрабатывает, а результат приходит только через 15 минут.

                      А 30 секунд - это тестирование. Не могу же я ждать по пол часа

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

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

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

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

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