Title: wp_schedule_single_event
Published: April 25, 2014
Last modified: February 24, 2026

---

# wp_schedule_single_event( int $timestamp, string $hook, array $args = array(), bool $wp_error = false ): bool|󠀁[WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)󠁿

## In this article

 * [Description](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#description)
 * [Parameters](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#changelog)
 * [User Contributed Notes](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#user-contributed-notes)

[ Back to top](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#wp--skip-link--target)

Schedules an event to run only once.

## 󠀁[Description](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#description)󠁿

Schedules a hook which will be triggered by WordPress at the specified UTC time.

The action will trigger when someone visits your WordPress site if the scheduled
time has passed.

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()](https://developer.wordpress.org/reference/functions/wp_next_scheduled/)
to prevent duplicate events.

Use [wp_schedule_event()](https://developer.wordpress.org/reference/functions/wp_schedule_event/)
to schedule a recurring event.

## 󠀁[Parameters](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#parameters)󠁿

 `$timestamp`intrequired

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

`$hook`stringrequired

Action hook to execute when the event is run.

`$args`arrayoptional

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:`array()`

`$wp_error`booloptional

Whether to return a [WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)
on failure.

Default:`false`

## 󠀁[Return](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#return)󠁿

 bool|[WP_Error](https://developer.wordpress.org/reference/classes/wp_error/) True
if event successfully scheduled. False or [WP_Error](https://developer.wordpress.org/reference/classes/wp_error/)
on failure.

## 󠀁[Source](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#source)󠁿

    ```php
    function wp_schedule_single_event( $timestamp, $hook, $args = array(), $wp_error = false ) {
    	// Make sure timestamp is a positive integer.
    	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
    		if ( $wp_error ) {
    			return new WP_Error(
    				'invalid_timestamp',
    				__( 'Event timestamp must be a valid Unix timestamp.' )
    			);
    		}

    		return false;
    	}

    	$event = (object) array(
    		'hook'      => $hook,
    		'timestamp' => $timestamp,
    		'schedule'  => false,
    		'args'      => $args,
    	);

    	/**
    	 * Filter to override scheduling an event.
    	 *
    	 * Returning a non-null value will short-circuit adding the event to the
    	 * cron array, causing the function to return the filtered value instead.
    	 *
    	 * Both single events and recurring events are passed through this filter;
    	 * single events have `$event->schedule` as false, whereas recurring events
    	 * have this set to a recurrence from wp_get_schedules(). Recurring
    	 * events also have the integer recurrence interval set as `$event->interval`.
    	 *
    	 * For plugins replacing wp-cron, it is recommended you check for an
    	 * identical event within ten minutes and apply the 'schedule_event'
    	 * filter to check if another plugin has disallowed the event before scheduling.
    	 *
    	 * Return true if the event was scheduled, false or a WP_Error if not.
    	 *
    	 * @since 5.1.0
    	 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned.
    	 *
    	 * @param null|bool|WP_Error $result   The value to return instead. Default null to continue adding the event.
    	 * @param object             $event    {
    	 *     An object containing an event's data.
    	 *
    	 *     @type string       $hook      Action hook to execute when the event is run.
    	 *     @type int          $timestamp Unix timestamp (UTC) for when to next run the event.
    	 *     @type string|false $schedule  How often the event should subsequently recur.
    	 *     @type array        $args      Array containing each separate argument to pass to the hook's callback function.
    	 *     @type int          $interval  Optional. The interval time in seconds for the schedule. Only present for recurring events.
    	 * }
    	 * @param bool               $wp_error Whether to return a WP_Error on failure.
    	 */
    	$pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error );

    	if ( null !== $pre ) {
    		if ( $wp_error && false === $pre ) {
    			return new WP_Error(
    				'pre_schedule_event_false',
    				__( 'A plugin prevented the event from being scheduled.' )
    			);
    		}

    		if ( ! $wp_error && is_wp_error( $pre ) ) {
    			return false;
    		}

    		return $pre;
    	}

    	/*
    	 * Check for a duplicated event.
    	 *
    	 * Don't schedule an event if there's already an identical event
    	 * within 10 minutes.
    	 *
    	 * When scheduling events within ten minutes of the current time,
    	 * all past identical events are considered duplicates.
    	 *
    	 * When scheduling an event with a past timestamp (ie, before the
    	 * current time) all events scheduled within the next ten minutes
    	 * are considered duplicates.
    	 */
    	$crons = _get_cron_array();

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

    	if ( $event->timestamp < time() + 10 * MINUTE_IN_SECONDS ) {
    		$min_timestamp = 0;
    	} else {
    		$min_timestamp = $event->timestamp - 10 * MINUTE_IN_SECONDS;
    	}

    	if ( $event->timestamp < time() ) {
    		$max_timestamp = time() + 10 * MINUTE_IN_SECONDS;
    	} else {
    		$max_timestamp = $event->timestamp + 10 * MINUTE_IN_SECONDS;
    	}

    	foreach ( $crons as $event_timestamp => $cron ) {
    		if ( $event_timestamp < $min_timestamp ) {
    			continue;
    		}

    		if ( $event_timestamp > $max_timestamp ) {
    			break;
    		}

    		if ( isset( $cron[ $event->hook ][ $key ] ) ) {
    			$duplicate = true;
    			break;
    		}
    	}

    	if ( $duplicate ) {
    		if ( $wp_error ) {
    			return new WP_Error(
    				'duplicate_event',
    				__( 'A duplicate event already exists.' )
    			);
    		}

    		return false;
    	}

    	/**
    	 * Modify an event before it is scheduled.
    	 *
    	 * @since 3.1.0
    	 *
    	 * @param object|false $event {
    	 *     An object containing an event's data, or boolean false to prevent the event from being scheduled.
    	 *
    	 *     @type string       $hook      Action hook to execute when the event is run.
    	 *     @type int          $timestamp Unix timestamp (UTC) for when to next run the event.
    	 *     @type string|false $schedule  How often the event should subsequently recur.
    	 *     @type array        $args      Array containing each separate argument to pass to the hook's callback function.
    	 *     @type int          $interval  Optional. The interval time in seconds for the schedule. Only present for recurring events.
    	 * }
    	 */
    	$event = apply_filters( 'schedule_event', $event );

    	// A plugin disallowed this event.
    	if ( ! $event ) {
    		if ( $wp_error ) {
    			return new WP_Error(
    				'schedule_event_false',
    				__( 'A plugin disallowed this event.' )
    			);
    		}

    		return false;
    	}

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

    	return _set_cron_array( $crons, $wp_error );
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/cron.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/cron.php#L39)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/cron.php#L39-L200)

## 󠀁[Hooks](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#hooks)󠁿

 [apply_filters( ‘pre_schedule_event’, null|bool|WP_Error $result, object $event, bool $wp_error )](https://developer.wordpress.org/reference/hooks/pre_schedule_event/)

Filter to override scheduling an event.

 [apply_filters( ‘schedule_event’, object|false $event )](https://developer.wordpress.org/reference/hooks/schedule_event/)

Modify an event before it is scheduled.

## 󠀁[Related](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#related)󠁿

| Uses | Description | 
| [_get_cron_array()](https://developer.wordpress.org/reference/functions/_get_cron_array/)`wp-includes/cron.php` |

Retrieves cron info array option.

  | 
| [_set_cron_array()](https://developer.wordpress.org/reference/functions/_set_cron_array/)`wp-includes/cron.php` |

Updates the cron option with the new cron array.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  | 
| [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` |

Checks whether the given variable is a WordPress Error.

  | 
| [WP_Error::__construct()](https://developer.wordpress.org/reference/classes/wp_error/__construct/)`wp-includes/class-wp-error.php` |

Initializes the error.

  |

[Show 4 more](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#)

| Used by | Description | 
| [wp_delete_all_temp_backups()](https://developer.wordpress.org/reference/functions/wp_delete_all_temp_backups/)`wp-includes/update.php` |

Schedules the removal of all contents in the temporary backup directory.

  | 
| [_wp_batch_update_comment_type()](https://developer.wordpress.org/reference/functions/_wp_batch_update_comment_type/)`wp-includes/comment.php` |

Updates the comment type for a batch of comments.

  | 
| [_wp_batch_split_terms()](https://developer.wordpress.org/reference/functions/_wp_batch_split_terms/)`wp-includes/taxonomy.php` |

Splits a batch of shared taxonomy terms.

  | 
| [WP_Automatic_Updater::after_core_update()](https://developer.wordpress.org/reference/classes/wp_automatic_updater/after_core_update/)`wp-admin/includes/class-wp-automatic-updater.php` |

Checks whether to send an email and avoid processing future updates after attempting a core update.

  | 
| [File_Upload_Upgrader::__construct()](https://developer.wordpress.org/reference/classes/file_upload_upgrader/__construct/)`wp-admin/includes/class-file-upload-upgrader.php` |

Construct the upgrader for a form.

  | 
| [wp_import_handle_upload()](https://developer.wordpress.org/reference/functions/wp_import_handle_upload/)`wp-admin/includes/import.php` |

Handles importer uploading and adds attachment.

  | 
| [wp_version_check()](https://developer.wordpress.org/reference/functions/wp_version_check/)`wp-includes/update.php` |

Checks WordPress version against the newest version.

  | 
| [_future_post_hook()](https://developer.wordpress.org/reference/functions/_future_post_hook/)`wp-includes/post.php` |

Hook used to schedule publication for a post marked for the future.

  | 
| [_publish_post_hook()](https://developer.wordpress.org/reference/functions/_publish_post_hook/)`wp-includes/post.php` |

Hook to schedule pings and enclosures when a post is published.

  | 
| [check_and_publish_future_post()](https://developer.wordpress.org/reference/functions/check_and_publish_future_post/)`wp-includes/post.php` |

Publishes future post and make sure post ID has future post status.

  |

[Show 5 more](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#)

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#changelog)󠁿

| Version | Description | 
| [5.7.0](https://developer.wordpress.org/reference/since/5.7.0/) | The `$wp_error` parameter was added. | 
| [5.1.0](https://developer.wordpress.org/reference/since/5.1.0/) | Return value modified to boolean indicating success or failure, ['pre_schedule_event'](https://developer.wordpress.org/reference/hooks/pre_schedule_event/) filter added to short-circuit the function. | 
| [2.1.0](https://developer.wordpress.org/reference/since/2.1.0/) | Introduced. |

## 󠀁[User Contributed Notes](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#user-contributed-notes)󠁿

 1.   [Skip to note 6 content](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#comment-content-1042)
 2.    [Codex](https://profiles.wordpress.org/codex/)  [  10 years ago  ](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/#comment-1042)
 3.  [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-1042)
     Vote results for this note: 4[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-1042)
 4.  **Schedule an event one hour from now with arguments**
 5.      ```php
         function do_this_in_an_hour( $arg1, $arg2, $arg3 ) {
             // do something
         }
         add_action( 'my_new_event', 'do_this_in_an_hour', 10, 3 );
     
         // put this line inside a function, 
         // presumably in response to something the user does
         // otherwise it will schedule a new event on every page visit
     
         wp_schedule_single_event( time() + 3600, 'my_new_event', array( $arg1, $arg2, $arg3 ) );
     
         // time() + 3600 = one hour from now.
         ```
     
 6.   [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%3Freplytocom%3D1042%23feedback-editor-1042)
 7.   [Skip to note 7 content](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#comment-content-1041)
 8.    [Codex](https://profiles.wordpress.org/codex/)  [  10 years ago  ](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/#comment-1041)
 9.  [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-1041)
     Vote results for this note: 3[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-1041)
 10. **Schedule an event one hour from now**
 11.     ```php
         function do_this_in_an_hour() {
     
             // do something
         }
         add_action( 'my_new_event','do_this_in_an_hour' );
     
         // put this line inside a function, 
         // presumably in response to something the user does
         // otherwise it will schedule a new event on every page visit
     
         wp_schedule_single_event( time() + 3600, 'my_new_event' );
     
         // time() + 3600 = one hour from now.
         ```
     
 12.  [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%3Freplytocom%3D1041%23feedback-editor-1041)
 13.  [Skip to note 8 content](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#comment-content-7054)
 14.   [adriantrimble](https://profiles.wordpress.org/adriantrimble/)  [  2 years ago  ](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/#comment-7054)
 15. [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-7054)
     Vote results for this note: 2[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-7054)
 16. Note that in PHP 8.0+ named array keys of `$args` are no longer ignored when passed
     to the callback function, they are passed as named parameters.
 17.  [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%3Freplytocom%3D7054%23feedback-editor-7054)
 18.  [Skip to note 9 content](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#comment-content-5686)
 19.   [kinanrod](https://profiles.wordpress.org/kinanrod/)  [  4 years ago  ](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/#comment-5686)
 20. [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-5686)
     Vote results for this note: 1[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-5686)
 21. Consider using WordPress’s [time constants](https://codex.wordpress.org/Easier_Expression_of_Time_Constants)
     when scheduling.
 22. Example:
 23.     ```php
         wp_schedule_single_event( time() + (DAY_IN_SECONDS * 5), 'some_hook_name', array( $arg1, $arg2, $arg3 ) );
         ```
     
 24. To schedule an event that would happen 5 days from now.
 25.  [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%3Freplytocom%3D5686%23feedback-editor-5686)
 26.  [Skip to note 10 content](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/?output_format=md#comment-content-5532)
 27.   [Tofandel](https://profiles.wordpress.org/tofandel/)  [  4 years ago  ](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/#comment-5532)
 28. [You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-5532)
     Vote results for this note: -2[You must log in to vote on the helpfulness of this note](https://login.wordpress.org?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%23comment-5532)
 29. The doc says “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.”
 30. The code says otherwise, there is no check on $args for duplicate, only the 10
     minutes time..
 31.  * That’s not true, it checks the args in this code: ` $key = md5( serialize( 
        $event->args ) ); //... if ( isset( $cron[ $event->hook ][ $key ] ) ) { $duplicate
        = true; break; } `
      * [gon123](https://profiles.wordpress.org/gon123/) [3 years ago](https://developer.wordpress.org/reference/functions/wp_schedule_single_event/#comment-6517)
 32.  [Log in to add feedback](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F%3Freplytocom%3D5532%23feedback-editor-5532)

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_schedule_single_event%2F)
before being able to contribute a note or feedback.