繁体   English   中英

Wordpress-如何安排功能每48小时运行一次

[英]Wordpress - How to schedule function to run every 48 hours

我在数据库中保存了一系列报价,我希望每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小时才能再次更改报价。 我觉得我可能在这里缺少一些简单的东西。

您的问题很可能是这样的:

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

当你有quote_cron_hook insted的的quotes_cron_hook一个有着s一个没有。 这种不匹配将导致条件永不失败,因为事件被命名为错误,从未计划,并且此条件在每个单个请求上均通过。 这反过来运行wp_schedule_event用的起始时间函数time (见下文)。

如果您查看下面wp_schedule_event链接的文档。 您拥有time()的第一个参数是

$ timestamp (整数)(必需)您第一次希望事件发生。 这必须是UNIX时间戳格式。 WP cron使用UTC / GMT时间,而不是本地时间。 使用time(),在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 / scheduler。 然后进入C-Panel或编辑crontab(crontab -e)并添加此cron作业以每分钟(或一些有用的时间间隔)运行

 php -q pathtowp/wp-cron.php

这样做是什么,它将控制时序的控制从wordpress转移到了“实际的” CRON应用程序(在Linux上)。 这样,它就不再依赖页面加载了。

但是,正如我所说的,并且由于这是某人应该查看的帖子,因此正常的WP行为可能对您而言是完全正常的。 通常,如果我对调度程序执行任何操作,则只能依靠真正的CRON,这就是我提到它的原因。

希望能帮助到你!

我认为您在想这是错误的方式。 您的标头中有do_action( 'quotes_cron_hook' ) ,它将在每次页面加载时触发quotes_cron_hook操作,这将使quotes_cron_function()在每次触发时都可以挂接到该操作中。 这似乎与您报告的行为一致。

关键是,设置WP cron作业不会强制挂钩仅以该特定间隔运行。 在您的情况下, 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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM