Wordpress - Как запланировать запуск функции каждые 48 часов - PullRequest
0 голосов
/ 05 февраля 2019

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

Я нашел код для планированияэто должно происходить с использованием пользовательского запланированного события cron каждые 48 часов.Тем не менее, я предполагаю, что внедряю это неправильно, потому что хотя на сайте появляется одна случайная цитата, она переключается на новую случайную цитату каждый раз, когда обновляется страница, а не один раз каждые 48 часов.

function quote_custom_cron_schedule( $schedules ) {
$schedules['every_two_days'] = array(
    'interval' => 172800, // Every 48 hours
    'display'  => __( 'Every 48 hours' ),
);
return $schedules;
}
add_filter( 'cron_schedules', 'quote_custom_cron_schedule' );

//Schedule an action if it's not already scheduled
if ( ! wp_next_scheduled( 'quote_cron_hook' ) ) {
wp_schedule_event( time(), 'every_two_days', 'quotes_cron_hook' );
}

//Hook into that action that'll fire every 48 hours
 add_action( 'quotes_cron_hook', 'quotes_cron_function' );

//Function that executes via cron
function quotes_cron_function() {
$args = array(
'post_type' => 'quote',
'orderby' => 'rand',
'posts_per_page'=> 1,
);

  $quotes = new WP_Query( $args );
  $quotes_output = '';

  if( $quotes->have_posts() ):
    while ( $quotes->have_posts() ) : $quotes->the_post();
      $quotes_title = get_the_title();
      $quotes_content = get_the_content();
      $quotes_output .= '<div id="quote"><p>&quot;' . $quotes_content . '&quot;</p><p class="quote-name">' . $quotes_title . '</p></div>';
    endwhile;
  else:
      $quotes_output = '';
  endif;

  wp_reset_postdata();
  echo $quotes_output;
}

У меня в файле header.php есть следующее:

<?php do_action( 'quotes_cron_hook' ); ?>

Эта функция выполняется, но выполняется каждый раз при обновлении страницы.Мне нужна функция, чтобы подождать 48 часов, прежде чем снова менять котировку.Я чувствую, что, возможно, здесь упускаю что-то простое.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я думаю, вы думаете об этом неправильно.У вас есть do_action( 'quotes_cron_hook' ) в заголовке, который будет запускать действие quotes_cron_hook каждый раз при загрузке страницы, что позволяет quotes_cron_function() подключаться к этому действию при каждом запуске.Это похоже на поведение, о котором вы сообщали.

Дело в том, что установка задания cron WP не приводит к запуску only с определенным интервалом.В вашем случае действие quotes_cron_hook срабатывает каждый раз при загрузке страницы, но оно также срабатывает один раз каждые 48 часов.

Мне кажется, что ваша желаемая функциональность заключается в том, чтобы получить «временную» цитату, но затемменяйте его каждые 48 часов.Чтобы сделать это, вам нужно что-то вроде:

if ( ! wp_next_scheduled( 'change_quote_hook' ) ) {
    wp_schedule_event( time(), 'every_two_days', 'change_quote_hook' );
}

add_action( 'change_quote_hook', 'change_quote_function' );

function change_quote_function() {
      $args = array(
          'post_type' => 'quote',
          'orderby' => 'rand',
          'posts_per_page'=> 1,
      );

      $quotes = new WP_Query( $args );
      $quotes_output = '';

      if( $quotes->have_posts() ):
          while ( $quotes->have_posts() ) :
              $quotes->the_post();
              // Set the temporary post using a WordPress option
              update_option( 'quote_post', get_the_ID() );
          endwhile;
      endif;

      wp_reset_postdata();
}

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

add_action( 'display_quote', 'display_quote_function' );
function display_quote_function() {
    // Get the quote post ID
    // The default, 1, will be returned if the option is not set
    $quote_id = get_option( 'quote_post', 1 );

    $quote = get_post( $quote_id ); 
    $quotes_title = quote->post_title;
    $quotes_content = quote->post_content;
    $quotes_output = '<div id="quote"><p>&quot;' . $quotes_content . '&quot;</p><p class="quote-name">' . $quotes_title . '</p></div>';
    echo $quotes_output;
}

do_action('display_quote');
0 голосов
/ 05 февраля 2019

Ваша проблема, как правило, такова:

if ( ! wp_next_scheduled( 'quote_cron_hook' ) ) {
    wp_schedule_event( time(), 'every_two_days', 'quotes_cron_hook' );
}

Если у вас quote_cron_hook указано quotes_cron_hook, у каждого есть s, а у другого - нет.Это несоответствие приведет к тому, что условие никогда не завершится неудачей, поскольку событие названо неверным, оно никогда не запланировано, и это условие передается при каждом отдельном запросе.Который в свою очередь запускает функцию wp_schedule_event со временем запуска time (см. Ниже).

Если вы посмотрите документацию по ссылке wp_schedule_event ниже.Первый аргумент, где у вас есть time(), это

$ timestamp (целое число) (обязательный) Первый раз, когда вы хотите, чтобы событие произошло.Это должно быть в формате отметки времени UNIX.WP cron использует время UTC / GMT, а не местное время.Используйте time (), который всегда равен GMT в WordPress.

Обратите внимание: В первый раз, когда вы хотите, чтобы событие произошло , с time(), которое сейчас, ипоскольку он назван неверно, он выполняет эту загрузку каждой страницы, а затем запускается прямо сейчас.

Конечно, вы можете установить time() на что-то другое, но это просто замаскирует проблему.

Другие вещи

Это также может быть неправильно.

  wp_schedule_event( time(), 'every_two_days', 'quotes_cron_hook' );

, более конкретно, глядя на документацию

https://codex.wordpress.org/Function_Reference/wp_schedule_event

$ recurrence (строка) (обязательно) Как часто событие должно повторяться.Допустимые значения:

  • ежечасно
  • два раза
  • ежедневно

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

Не знаюне вижу там every_two_days, если это не документировано.Честно говоря, я не очень часто использовал планировщик WP.Default: None, вероятно, то, что вы на самом деле имеете здесь, так как WP не распознает это значение, поэтому оно возвращается к нулю.Но что именно это делает, я не уверен.

Еще больше Другие вещи

Как я сказал в комментариях (и это может быть хорошо для вашего использования, но продолжайтеэто имеет в виду)

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

Добавить это в wp-config.php

 define('DISABLE_WP_CRON', true);

Отключить встроенный cron / планировщик.Затем перейдите в C-Panel или отредактируйте crontab (crontab -e) и добавьте это задание cron для запуска каждую минуту (или некоторый полезный интервал)

 php -q pathtowp/wp-cron.php

Что это делает, он берет под контроль время планировщикаподальше от WordPress и отдайте его «актуальному» CRON-приложению (в Linux)Таким образом, он не полагается на загрузку страниц.

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

Надеюсь, это поможет!

...