mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-06-28 22:30:04 +00:00
wp_schedule_single_event() should not prevent scheduling a future duplicate event. It should only reject an event as a duplicate if there is already a similar event scheduled within 10 minutes of the given timestamp.
Adds unit tests, fixes existing cron test. Props tellyworth. See [9181], #6966. Fixes #28213. git-svn-id: https://develop.svn.wordpress.org/trunk@29939 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -20,10 +20,11 @@
|
||||
* @param array $args Optional. Arguments to pass to the hook's callback function.
|
||||
*/
|
||||
function wp_schedule_single_event( $timestamp, $hook, $args = array()) {
|
||||
// don't schedule a duplicate if there's already an identical event due in the next 10 minutes
|
||||
// don't schedule a duplicate if there's already an identical event due within 10 minutes of it
|
||||
$next = wp_next_scheduled($hook, $args);
|
||||
if ( $next && $next <= $timestamp + 10 * MINUTE_IN_SECONDS )
|
||||
if ( $next && abs( $next - $timestamp ) <= 10 * MINUTE_IN_SECONDS ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$crons = _get_cron_array();
|
||||
$event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => false, 'args' => $args );
|
||||
|
||||
@@ -214,20 +214,39 @@ class Tests_Cron extends WP_UnitTestCase {
|
||||
function test_not_duplicate_event() {
|
||||
// duplicate events far apart should work normally
|
||||
$hook = rand_str();
|
||||
$args = array(rand_str());
|
||||
$ts1 = strtotime('+30 minutes');
|
||||
$ts2 = strtotime('+3 minutes');
|
||||
$args = array( rand_str() );
|
||||
$ts1 = strtotime( '+30 minutes' );
|
||||
$ts2 = strtotime( '+3 minutes' );
|
||||
|
||||
// first one works
|
||||
wp_schedule_single_event( $ts1, $hook, $args );
|
||||
// second works too
|
||||
wp_schedule_single_event( $ts2, $hook, $args );
|
||||
|
||||
// the next event should be at +5 minutes, not +3
|
||||
$this->assertEquals( $ts2, wp_next_scheduled($hook, $args) );
|
||||
// the next event should be at +3 minutes, even though that one was scheduled second
|
||||
$this->assertEquals( $ts2, wp_next_scheduled( $hook, $args ) );
|
||||
wp_unschedule_event( $ts2, $hook, $args );
|
||||
// following event at +30 minutes should be there too
|
||||
$this->assertEquals( $ts1, wp_next_scheduled( $hook, $args ) );
|
||||
}
|
||||
|
||||
function test_not_duplicate_event_reversed() {
|
||||
// duplicate events far apart should work normally regardless of order
|
||||
$hook = rand_str();
|
||||
$args = array( rand_str() );
|
||||
$ts1 = strtotime( '+3 minutes' );
|
||||
$ts2 = strtotime( '+30 minutes' );
|
||||
|
||||
// first one works
|
||||
wp_schedule_single_event( $ts1, $hook, $args );
|
||||
// second works too
|
||||
wp_schedule_single_event( $ts2, $hook, $args );
|
||||
|
||||
// the next event should be at +3 minutes
|
||||
$this->assertEquals( $ts1, wp_next_scheduled( $hook, $args ) );
|
||||
wp_unschedule_event( $ts1, $hook, $args );
|
||||
// following event should be there too
|
||||
$this->assertEquals( $ts1, wp_next_scheduled($hook, $args) );
|
||||
$this->assertEquals( $ts2, wp_next_scheduled( $hook, $args ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user