Index: src/wp-admin/admin-ajax.php
===================================================================
--- src/wp-admin/admin-ajax.php	(revision 42890)
+++ src/wp-admin/admin-ajax.php	(working copy)
@@ -130,6 +130,7 @@
 	'get-community-events',
 	'edit-theme-plugin-file',
 	'wp-privacy-export-personal-data',
+	'wp-privacy-erase-personal-data',
 );
 
 // Deprecated
Index: src/wp-admin/includes/ajax-actions.php
===================================================================
--- src/wp-admin/includes/ajax-actions.php	(revision 42890)
+++ src/wp-admin/includes/ajax-actions.php	(working copy)
@@ -4327,116 +4327,185 @@
 	}
 }
 
+/**
+ * Ajax handler for exporting a page of personal data.
+ *
+ * @since 4.9.5
+ */
 function wp_ajax_wp_privacy_export_personal_data() {
-//	check_ajax_referer( 'wp-privacy-export-personal-data', 'security' );
+	check_ajax_referer( 'wp-privacy-export-personal-data', 'security' );
 
+	$email_address   = sanitize_text_field( $_POST['email'] );
+	$processor_index = (int) $_POST['exporter'];
+	$page            = (int) $_POST['page'];
+
+	wp_privacy_do_personal_data_callback( 'export', $processor_index, $email_address, $page );
+}
+
+/**
+ * Ajax handler for erasing a page of personal data.
+ *
+ * @since 4.9.5
+ */
+function wp_ajax_wp_privacy_erase_personal_data() {
+	check_ajax_referer( 'wp-privacy-erase-personal-data', 'security' );
+
+	$email_address   = sanitize_text_field( $_POST['email'] );
+	$processor_index = (int) $_POST['eraser'];
+	$page            = (int) $_POST['page'];
+
+	wp_privacy_do_personal_data_callback( 'erase', $processor_index, $email_address, $page );
+}
+
+/**
+ * Handler for exporting or erasing a page of personal data.
+ *
+ * @since 4.9.5
+ *
+ * @param string $type            The type of processing requested: "export" or "erase"
+ * @param int    $processor_index The index of the processor that should be called.
+ * @param string $email_address   The email address for which processing is being performed.
+ * @param int    $page            The 1-based page of data to be processed.
+ */
+
+function wp_privacy_do_personal_data_callback( $type, $processor_index, $email_address, $page ) {
 	if ( ! current_user_can( 'manage_options' ) ) {
 		wp_send_json_error( 'access denied' );
 	}
 
-	$email_address  = sanitize_text_field( $_POST['email'] );
-	$exporter_index = (int) $_POST['exporter'];
-	$page           = (int) $_POST['page'];
+	$allowed_types = array( 'export', 'erase' );
 
-	/**
-	 * Filters the array of exporter callbacks.
-	 *
-	 * @since 4.9.5.
-	 *
-	 * @param array $args {
-	 *     An array of callable exporters of personal data. Default empty array.
-	 *     [
-	 *         callback               string  Callable exporter that accepts an email address and
-	 *                                        a page and returns an array of name => value
-	 *                                        pairs of personal data
-	 *         exporter_friendly_name string  Translated user facing friendly name for the exporter
-	 *     ]
-	 * }
-	 */
-	$exporters = apply_filters( 'wp_privacy_personal_data_exporters', array() );
+	if ( ! in_array( $type, $allowed_types ) ) {
+		wp_send_json_error( 'invalid processor type' );
+	}
 
-	if ( ! is_array( $exporters ) ) {
-		wp_send_json_error( 'An exporter has improperly used the registration filter.' );
+	$processors = array();
+	if ( 'export' === $type ) {
+		/**
+		 * Filters the array of exporter callbacks.
+		 *
+		 * @since 4.9.5.
+		 *
+		 * @param array $args {
+		 *     An array of callable exporters of personal data. Default empty array.
+		 *     [
+		 *         callback               string  Callable exporter that accepts an email address and
+		 *                                        a page and returns an array of personal data
+		 *         exporter_friendly_name string  Translated user facing friendly name for the exporter
+		 *     ]
+		 * }
+		 */
+		$processors = apply_filters( 'wp_privacy_personal_data_exporters', $processors );
+	} else if ( 'erase' === $type ) {
+		/**
+		 * Filters the array of eraser callbacks.
+		 *
+		 * @since 4.9.5.
+		 *
+		 * @param array $args {
+		 *     An array of callable erasers of personal data. Default empty array.
+		 *     [
+		 *         callback             string  Callable eraser that accepts an email address and page
+		 *         eraser_friendly_name string  Translated user facing friendly name for the eraser
+		 *     ]
+		 * }
+		 */
+		$processors = apply_filters( 'wp_privacy_personal_data_erasers', $processors );
 	}
+	if ( ! is_array( $processors ) ) {
+		wp_send_json_error( 'A processor has improperly used the registration filter.' );
+	}
 
-	// Do we have any registered exporters?
-	if ( 0 < count( $exporters ) ) {
-		if ( $exporter_index < 1 ) {
-			wp_send_json_error( 'Exporter index cannot be negative.' );
-		}
+	// Initialize the default response
+	$response = array(
+		'data' => array(),
+		'done' => true,
+	);
 
-		if ( $exporter_index > count( $exporters ) ) {
-			wp_send_json_error( 'Exporter index out of range.' );
-		}
+	// No registered processors?  We're done
+	if ( 0 === count( $processors ) ) {
+		wp_send_json_success( $response );
+	}
 
-		$index = $exporter_index - 1;
+	// Otherwise, let's validate and handle the request
+	if ( $processor_index < 1 ) {
+		wp_send_json_error( 'Processor index cannot be less than one.' );
+	}
 
-		if ( $page < 1 ) {
-			wp_send_json_error( 'Page index cannot be less than one.' );
-		}
+	if ( $processor_index > count( $processors ) ) {
+		wp_send_json_error( 'Processor index out of range.' );
+	}
 
-		// Surprisingly, email addresses can contain mutli-byte characters now
-		$email_address = trim( mb_strtolower( $email_address ) );
+	if ( $page < 1 ) {
+		wp_send_json_error( 'Page index cannot be less than one.' );
+	}
 
-		if ( ! is_email( $email_address ) ) {
-			wp_send_json_error( 'A valid email address must be given.' );
-		}
+	// Surprisingly, email addresses can contain mutli-byte characters now
+	$email_address = trim( mb_strtolower( $email_address ) );
 
-		$exporter = $exporters[ $index ];
-		if ( ! is_array( $exporter ) ) {
-			wp_send_json_error( "Expected an array describing the exporter at index {$exporter_index}." );
-		}
-		if ( ! array_key_exists( 'callback', $exporter ) ) {
-			wp_send_json_error( "Exporter array at index {$exporter_index} does not include a callback." );
-		}
-		if ( ! is_callable( $exporter['callback'] ) ) {
-			wp_send_json_error( "Exporter callback at index {$exporter_index} is not a valid callback." );
-		}
-		if ( ! array_key_exists( 'exporter_friendly_name', $exporter ) ) {
-			wp_send_json_error( "Exporter array at index {$exporter_index} does not include a friendly name." );
-		}
+	if ( ! is_email( $email_address ) ) {
+		wp_send_json_error( 'A valid email address must be given.' );
+	}
 
-		$callback = $exporters[ $index ]['callback'];
-		$exporter_friendly_name = $exporters[ $index ]['exporter_friendly_name'];
+	$processor = $processors[ $processor_index - 1 ];
+	if ( ! is_array( $processor ) ) {
+		wp_send_json_error( "Expected an array describing the processor at index {$processor_index}." );
+	}
+	if ( ! array_key_exists( 'callback', $processor ) ) {
+		wp_send_json_error( "Processor array at index {$processor_index} does not include a callback." );
+	}
+	if ( ! is_callable( $processor['callback'] ) ) {
+		wp_send_json_error( "Processor callback at index {$processor_index} is not a valid callback." );
+	}
 
-		$response = call_user_func( $callback, $email_address, $page );
-		if ( is_wp_error( $response ) ) {
-			wp_send_json_error( $response );
-		}
+	$response = call_user_func( $processor['callback'], $email_address, $page );
+	if ( is_wp_error( $response ) ) {
+		wp_send_json_error( $response );
+	}
 
-		if ( ! is_array( $response ) ) {
-			wp_send_json_error( "Expected response as an array from exporter: {$exporter_friendly_name}." );
+	if ( 'export' === $type ) {
+		$processor_friendly_name = __( 'Unnamed exporter' );
+	} else if ( 'erase' === $type ) {
+		$processor_friendly_name = __( 'Unnamed eraser' );
+	}
+
+	if ( array_key_exists( 'friendly_name', $processor ) ) {
+		if ( ! empty( $processor['friendly_name'] ) ) {
+			$processor_friendly_name = $processor['friendly_name'];
 		}
-		if ( ! array_key_exists( 'data', $response ) ) {
-			wp_send_json_error( "Expected data in response array from exporter: {$exporter_friendly_name}." );
-		}
-		if ( ! is_array( $response['data'] ) ) {
-			wp_send_json_error( "Expected data array in response array from exporter: {$exporter_friendly_name}." );
-		}
-		if ( ! array_key_exists( 'done', $response ) ) {
-			wp_send_json_error( "Expected done (boolean) in response array from exporter: {$exporter_friendly_name}." );
-		}
-	} else {
-		// No exporters, so we're done
-		$response = array(
-			'data' => array(),
-			'done' => true,
-		);
 	}
 
-	/**
-	 * Filters a page of personal data exporter data. Used to build the export report.
-	 *
-	 * Allows the export response to be consumed by destinations in addition to Ajax.
-	 *
-	 * @since 4.9.5
-	 *
-	 * @param array  $response        The personal data for the given exporter and page.
-	 * @param int    $exporter_index  The index of the exporter that provided this data.
-	 * @param string $email_address   The email address associated with this personal data.
-	 * @param int    $page            The zero-based page for this response.
-	 */
-	$response = apply_filters( 'wp_privacy_personal_data_export_page', $response, $exporter_index, $email_address, $page );
+	if ( ! is_array( $response ) ) {
+		wp_send_json_error( "Expected response as an array from {$processor_friendly_name}." );
+	}
+	if ( ! array_key_exists( 'data', $response ) ) {
+		wp_send_json_error( "Expected data in response array from {$processor_friendly_name}." );
+	}
+	if ( ! is_array( $response['data'] ) ) {
+		wp_send_json_error( "Expected data array in response array from {$processor_friendly_name}." );
+	}
+	if ( ! array_key_exists( 'done', $response ) ) {
+		wp_send_json_error( "Expected done (boolean) in response array from {$processor_friendly_name}." );
+	}
+
+	// If we're doing an export, run the export filter (for things like export file assembly)
+	if ( 'export' === $type ) {
+		/**
+		 * Filters a page of personal data exporter data. Used to build the export report.
+		 *
+		 * Allows the export response to be consumed by destinations in addition to Ajax.
+		 *
+		 * @since 4.9.5
+		 *
+		 * @param array  $response        The personal data for the given exporter and page.
+		 * @param int    $processor_index The index of the exporter that provided this data.
+		 * @param string $email_address   The email address associated with this personal data.
+		 * @param int    $page            The 1-based page for this response.
+		 */
+		$response = apply_filters( 'wp_privacy_personal_data_export_page', $response, $processor_index, $email_address, $page );
+	}
+
+	// And lastly, send our response
 	if ( is_wp_error( $response ) ) {
 		wp_send_json_error( $response );
 	}
