wp_schedule_event( int $timestamp, string $recurrence, string $hook, array $args = array() )

Schedules a recurring event.


Description Description

Schedules a hook which will be triggered by WordPress at the specified interval. The action will trigger when someone visits your WordPress site if the scheduled time has passed.

Valid values for the recurrence are ‘hourly’, ‘daily’, and ‘twicedaily’. These can be extended using the ‘cron_schedules’ filter in wp_get_schedules().

Note that scheduling an event to occur within 10 minutes of an existing event with the same action hook will be ignored unless you pass unique $args values for each scheduled event.

Use wp_next_scheduled() to prevent duplicate events.

Use wp_schedule_single_event() to schedule a non-recurring event.


Top ↑

Parameters Parameters

$timestamp

(int) (Required) Unix timestamp (UTC) for when to next run the event.

$recurrence

(string) (Required) How often the event should subsequently recur. See wp_get_schedules() for accepted values.

$hook

(string) (Required) Action hook to execute when the event is run.

$args

(array) (Optional) Array containing arguments to pass to the hook's callback function. Each value in the array is passed to the callback as an individual parameter. The array keys are ignored. Default: empty array.

Default value: array()


Top ↑

Return Return

(bool) True if event successfully scheduled. False for failure.


Top ↑

Source Source

File: wp-includes/cron.php

function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array() ) {
	// Make sure timestamp is a positive integer.
	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
		return false;
	}

	$schedules = wp_get_schedules();

	if ( ! isset( $schedules[ $recurrence ] ) ) {
		return false;
	}

	$event = (object) array(
		'hook'      => $hook,
		'timestamp' => $timestamp,
		'schedule'  => $recurrence,
		'args'      => $args,
		'interval'  => $schedules[ $recurrence ]['interval'],
	);

	/** This filter is documented in wp-includes/cron.php */
	$pre = apply_filters( 'pre_schedule_event', null, $event );
	if ( null !== $pre ) {
		return $pre;
	}

	/** This filter is documented in wp-includes/cron.php */
	$event = apply_filters( 'schedule_event', $event );

	// A plugin disallowed this event.
	if ( ! $event ) {
		return false;
	}

	$key = md5( serialize( $event->args ) );

	$crons = _get_cron_array();
	$crons[ $event->timestamp ][ $event->hook ][ $key ] = array(
		'schedule' => $event->schedule,
		'args'     => $event->args,
		'interval' => $event->interval,
	);
	uksort( $crons, 'strnatcasecmp' );
	return _set_cron_array( $crons );
}


Top ↑

Changelog Changelog

Changelog
Version Description
5.1.0 Return value modified to boolean indicating success or failure, 'pre_schedule_event' filter added to short-circuit the function.
2.1.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

  1. Skip to note 1 content
    Contributed by Sushil Adhikari

    Schedule hourly event with multiple arguments
    wp_schedule_event() pass arguments by reference, so we have to send multiple data as indexed array.

    register_activation_hook( __FILE__, 'my_activation' );
     
    function my_activation() {
    	$args = array( $args_1, $args_2 );
    	if (! wp_next_scheduled ( 'my_hourly_event', $args )) {
        	wp_schedule_event( time(), 'hourly', 'my_hourly_event', $args );
        }
    }

    Don’t forgot to add total number of argument as $accepted_args on add_action().

    add_action( 'my_hourly_event', 'do_this_hourly', 10, 2 );
    function do_this_hourly($args_1, $args_2 ) {
        // do something every hour
    }

    Don’t forget to clean the scheduler on deactivation:

    register_deactivation_hook( __FILE__, 'my_deactivation' );
     
    function my_deactivation() {
        wp_clear_scheduled_hook( 'my_hourly_event' );
    }
  2. Skip to note 2 content

    An actual working best-practice minimal example.

    function svd_deactivate() {
    	wp_clear_scheduled_hook( 'svd_cron' );
    }
    
    add_action('init', function() {
    	add_action( 'svd_cron', 'svd_run_cron' );
    	register_deactivation_hook( __FILE__, 'svd_deactivate' );
    
    	if (! wp_next_scheduled ( 'svd_cron' )) {
    		wp_schedule_event( time(), 'daily', 'svd_cron' );
    	}
    });
    
    function svd_run_cron() {
    	// do your stuff.
    }
    
  3. Skip to note 3 content
    Contributed by Codex

    Schedule an hourly event
    To schedule an hourly event in a plugin, call wp_schedule_event on activation (otherwise you will end up with a lot of scheduled events!):

    register_activation_hook( __FILE__, 'my_activation' );
    add_action( 'my_hourly_event', 'do_this_hourly' );
    
    function my_activation() {
        wp_schedule_event( time(), 'hourly', 'my_hourly_event' );
    }
    
    function do_this_hourly() {
        // do something every hour
    }

    Don’t forget to clean the scheduler on deactivation:

    register_deactivation_hook( __FILE__, 'my_deactivation' );
    
    function my_deactivation() {
        wp_clear_scheduled_hook( 'my_hourly_event' );
    }
  4. Skip to note 6 content
    Contributed by Chad Reitsma

    It should be noted that depending on how resource-intensive your hook is, the default behavior of “Waiting until a user visits the site” may not be suitable. Of course you should try to make your code as efficient as possible – but if you have a specific case where it’s still resource intensive you do not want to keep the user sitting on a white screen while your hook does it’s work.

    For specific situations you might want to consider disabling WP’s internal CRON by placing this line:
    define('DISABLE_WP_CRON', 'true');
    into the file: wp-config.php

    Then create a CRON job with your hosting control panel to fetch the URL:
    https://example.com/wp-cron.php?doing_wp_cron

    OR execute:
    /usr/bin/php -q /path-to-your-wp-installation/wp-cron.php

    Your specific environment may vary.

You must log in before being able to contribute a note or feedback.