Cron task with scheduled timestamp in the past

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 ?

Topic timestamp cron Wordpress

Category Web


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

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.