diff --git wp-includes/comment.php wp-includes/comment.php
index b4f4125..0e92a4b 100644
--- wp-includes/comment.php
+++ wp-includes/comment.php
@@ -1377,6 +1377,14 @@ function do_trackbacks($post_id) {
  * @return int Same as Post ID from parameter
  */
 function generic_ping($post_id = 0) {
+	$last_ping = get_option('generic_ping_last');
+
+	if ( $last_ping === false ) {
+		add_option('generic_ping_last', time());
+	} else {
+		update_option('generic_ping_last', time());
+	}
+
 	$services = get_option('ping_sites');
 
 	$services = explode("\n", $services);
diff --git wp-includes/post.php wp-includes/post.php
index 0c0ba46..cfe755f 100644
--- wp-includes/post.php
+++ wp-includes/post.php
@@ -3275,8 +3275,10 @@ function _transition_post_status($new_status, $old_status, $post) {
 			$wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post->ID ) ), array( 'ID' => $post->ID ) );
 		do_action('private_to_published', $post->ID);  // Deprecated, use private_to_publish
 		// do generic pings once per hour at most
-		if ( !wp_next_scheduled('do_generic_ping') )
-			wp_schedule_single_event(time() + 3600, 'do_generic_ping');
+		if ( !wp_next_scheduled('do_generic_ping') ) {
+			$last_ping = get_option('generic_ping_last', 0);
+			wp_schedule_single_event(max(time() + 60, $last_ping + 1800), 'do_generic_ping');
+		}
 	}
 
 	// Always clears the hook in case the post status bounced from future to draft.
