Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

The scenario is to run insert_post function every midnight (00:00) of local time. Must run daily on weekday.

function add_daily_task(){
    if((date('l', time()) != 'Saturday') || (date('l', time()) != 'Sunday')){ 
        // insert post
    }
}

if(!wp_next_scheduled( 'add_daily_task_schedule')){
    wp_schedule_event(time(), 'daily', 'add_daily_task_schedule');
    // how should change time() to meet my local schedule?
}

add_action('add_daily_task_schedule', 'add_daily_task'); 
share|improve this question
    
The goal of this cron job is to grab financial data and import it to custom table. This data will be read with an interactive chart. The financial data only run on weekday. –  Ivan Slaughter Aug 4 '13 at 7:30
add comment

3 Answers

wp_schedule_event can not be used for PRECISE time measurements as you are trying to do. An event scheduled with wp_schedule_event rarely runs exactly when it is scheduled to run, it runs sometime after the time which it has been configured for.

To understand this, you must understand that php doesn't know what time it is until you ask it to look. Wordpress checks the time whenever someone visits your website. It then compares the current time with the time of any scheduled tasks. If the time is equal to or greater (after) than the scheduled time, it runs the task.

So this means that even if you figure out your time scheduling issue, your task will not run until both the time you choose has elapsed AND someone loads your website.

With all of that said, if you still want to try and make this work, here is one possible solution. Add a new interval to your functions.php

function cron_add_weekly( $schedules ) {
    // Adds once weekly to the existing schedules.
    $schedules['weekly'] = array(
            'interval' => 604800,
            'display' => __( 'Once Weekly' )
    );
    return $schedules;
}

change your function to wp_schedule_event(time(), 'weekly', 'add_daily_task_schedule');

If you put this in place at exactly midnight next saturday, Wordpress will attempt to run this schedule every week at the same time of day (assuming someone goes to your site to trigger the schedule).

share|improve this answer
add comment

The function:

time()

gives the UNIX timestamp in the GMT timezone.

So if you are GMT+2 you can use:

time() + 2*60*60;

or if you are GMT-4 you can use:

time() - 4*60*60;

Try replacing time() with mytime() in your code, where:

function mytime(){
    $gmt_offset_in_hours=-2; // for GMT-2 (EDIT this value) 
    return time() + $gmt_offset_in_hours*60*60;     
}
share|improve this answer
add comment

Not sure what is the question, but the use of time() is wrong as it will give you at best the local time of the server and not the local time of the site which takes into consideration the time zone configuration of WordPress.

The function that you should use is current_time.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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