Run WP Cron Weekly (but on a certain day)

I’m looking add-in a bit more speficity to the WP Cron intervals. To add a “weekly” interval, I’ve done the following:

function re_not_add_weekly( $schedules ) {
    $schedules['weekly'] = array(
        'interval' => 604800, //that's how many seconds in a week, for the unix timestamp
        'display' => __('weekly')
    );
    return $schedules;
}
add_filter('cron_schedules', 're_not_add_weekly');

Which works great, but – the extra sauce here is getting that cron to run on a specific day:

Read More
if( !wp_next_scheduled( 're_not_mail' ) ) {
    wp_schedule_event( time(), 'weekly', 're_not_mail' );
}

Anyone have any thoughts on the best way to accomplish this using WP Cron (assuming this isn’t per a specific site that we’ll have control over their cPanel/CRON area). Thanks!

Update

Going at this full-force and found an article that may have clarified things a bit more, but doesn’t exactly answer my question. The basic gist of that article states that the WP Cron isn’t as flexible (past the “hourly, daily, weekly” params), so extending it to something like weekly on a certain day seems a bit farfetched.

The issue (calling it an issue out of confusion/frustration) I have with that is -> sure, I could disable WP CRON and have WP CRON run once a week using the server CRON, BUT, that also means that the items that are normally run, like plugin/theme updates, post deletions/publishes based on CRON are put on a backlog for an entire week (if I wanted CRON to run once a week every Monday for example).

I’d have to assume others have come across this, so anymore insight on this would be a huge help. Thanks!

Related posts

Leave a Reply

4 comments

  1. WP-Cron is not intended to be that precise, and should not be used if you have to have things scheduled at specific times. WP-Cron is a “best effort” scheduling mechanism, and it cannot guarantee run timing like a real cron system can.

    If you need precision of this nature, the only real answer is to not use WP-Cron for it. It’s not designed for that, and it cannot do it. Any hacky code you attempt to add to it to make it capable of this won’t fix that underlying problem.

    Use a real cron system.

  2. If you have important WP cron jobs on a schedule you should of course have a system cron job running that regularly calls WP cron to make things are always fired when you need them.

    If you need a specific time/date for your WP cron runs you can always schedule a single event and have the called method schedule the next event.

    Simple example:

    function some_awesome_hook() {
        // Do stuff here
    
        // Run next Monday
        $next_run = strtotime('next monday');
    
        // Clear hook, just in case
        wp_clear_scheduled_hook('some_awesome_hook');
    
        // Add our event
        wp_schedule_single_event($next_run, 'some_awesome_hook');
    }
    
    // Run next Monday
    $first_run = strtotime('next monday');
    
    // Add our event
    wp_schedule_single_event($first_run, 'some_awesome_hook');
    

    OOP style:

    class My_Sweet_Plugin {
    
        public $cron_hook;
    
        public function __construct() {
            // Store our cron hook name
            $this->cron_hook = 'my_awesome_cron_hook';
    
            // Install cron!
            $this->setup_cron();
    
            // Add action that points to class method
            add_action($this->cron_hook, array($this, 'my_awesome_function'));
        }
    
        public function setup_cron() {
            // Clear existing hooks
            wp_clear_scheduled_hook($this->cron_hook);
    
            // Next run time
            $next_run = strtotime('next monday');
    
            // Add single event
            wp_schedule_single_event($first_run, $this->cron_hook);
        }
    
        public function my_awesome_function() {
            // Do stuff!
    
            // Setup our next run
            $this->setup_cron();
        }
    }
    
  3. According to Codex you can use wp_get_schedules to add in an option like Weekly (which you’ve already done).

    WP-Cron was not intended to have all the Cron functions so why not just login to the server and create a cron job to call your PHP file only on Monday and add something like this to your crontab

    * 07 * * Mon root cmd

  4. You can use this approach

    //Your cron function which you want to execute any specific day, e.g. Monday
    function daily_cron_callback() {
        $timestamp = time();    
        
        if(date('D', $timestamp) !== 'Mon') { //do nothing, if not Monday
            return;
        }
        
        //Process your logic here
    }