过去具有计划时间戳的Cron任务

时间:2020-06-23 作者:J.BizMai

我正在进行一些设置以启用/禁用cron任务,并选择运行此任务的时间。

当我禁用cron任务并在不更改时间的情况下启用它时,我的时间戳是过去的,并出现以下错误:

WP Control Plugin Result

enter image description here

My code

function scheduled_task_activation(){
    $hook = \'my_hook\';
    $options_values = get_option( "option_name" );
    $is_cron_active = (!empty( $options_values[\'cron-sync-active\'] ) ) ? true : false;
    $cron_sync_time = (!empty( $options_values[\'cron-sync-time\'] ) ) ? $options_values[\'cron-sync-time\']: "00:00:00";
    if( !$is_cron_active ){
        if( wp_next_scheduled( $hook ) ){
            wp_clear_scheduled_hook( $hook );
        }
    }
    else if ( ! wp_next_scheduled( $hook ) || ( $cron_sync_time !== get_option( "cron_time_used") )  ) {
        if( $cron_sync_time !== get_option( "cron_time_used" ) )
            wp_clear_scheduled_hook( $hook ); //avoid dupplication
        var_dump( $cron_sync_time ); //Output : (string) "04:30"
        wp_schedule_event( strtotime($cron_sync_time), \'daily\', $hook);
        update_option( "cron_time_used", $cron_sync_time );
    }
}
如果$cron_sync_time 是字符串;04:30“;,为什么时间戳应该在过去?有人知道怎么解决这个问题吗?

1 个回复
SO网友:J.BizMai

原因是当您只设置了一个没有日期的时间时,php函数strtotime() 默认情况下,将今天添加为日期,因此如果时间为;04:30“;,时间戳在过去。

我这样修复:

  $timestamp = strtotime( $cron_sync_time );
  if( $timestamp < time() ){ //if the time already past today
      $timestamp = $timestamp + 60 * 60 * 24; //add 1 day
  }
  wp_schedule_event( $timestamp, \'daily\', $hook);

Full code

function scheduled_task_activation(){
    $hook = \'my_hook\';
    $options_values = get_option( "option_name" );
    $is_cron_active = (!empty( $options_values[\'cron-sync-active\'] ) ) ? true : false;
    $cron_sync_time = (!empty( $options_values[\'cron-sync-time\'] ) ) ? $options_values[\'cron-sync-time\']: "00:00:00";
    if( !$is_cron_active ){
        if( wp_next_scheduled( $hook ) ){
            wp_clear_scheduled_hook( $hook );
        }
    }
    else if ( ! wp_next_scheduled( $hook ) || ( $cron_sync_time !== get_option( "cron_time_used") )  ) {
        if( $cron_sync_time !== get_option( "cron_time_used" ) )
            wp_clear_scheduled_hook( $hook ); //avoid dupplication
        $timestamp = strtotime( $cron_sync_time );
        if( $timestamp < time() ){
            $timestamp = $timestamp + 60 * 60 * 24;
        }
        wp_schedule_event( $timestamp, \'daily\', $hook);
        update_option( "cron_time_used", $cron_sync_time );
    }
}

相关推荐

为什么wp-cron只在页面访问时执行?

据我所知,wp-cron在对给定域的HTTP请求之后运行。有人能给我解释一下为什么会这样吗?我不太明白为什么(计划的)wp cron事件的执行依赖于访问页面的用户?我对WordPress开发还很陌生,所以我可能只是对基本的编程概念缺乏一般性的理解。