admin管理员组

文章数量:1333386

I´m doing some setting to enable/disable a cron task and choose a time to run this task.

When I disable the cron task and enable it after without changed the time, my timestamp is in the past and make this error :

WP Control Plugin Result

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 );
    }
}

If $cron_sync_time is a string "04:30", why the timestamp should be in the past ? Someone knows the way to fix this ?

I´m doing some setting to enable/disable a cron task and choose a time to run this task.

When I disable the cron task and enable it after without changed the time, my timestamp is in the past and make this error :

WP Control Plugin Result

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 );
    }
}

If $cron_sync_time is a string "04:30", why the timestamp should be in the past ? Someone knows the way to fix this ?

Share Improve this question edited Jun 23, 2020 at 14:29 J.BizMai asked Jun 23, 2020 at 13:58 J.BizMaiJ.BizMai 9002 gold badges10 silver badges30 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

The reason is when you set only a time without date, the php function strtotime() by default add today as a date so if the time is "04:30", the timestamp is in the past.

I fixed like this :

  $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 );
    }
}

本文标签: Cron task with scheduled timestamp in the past