0

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

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

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

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.