WordPress Version: 6.4
/**
* Handles exporting a user's personal data via AJAX.
*
* @since 4.9.6
*/
function wp_ajax_wp_privacy_export_personal_data()
{
if (empty($_POST['id'])) {
wp_send_json_error(__('Missing request ID.'));
}
$request_id = (int) $_POST['id'];
if ($request_id < 1) {
wp_send_json_error(__('Invalid request ID.'));
}
if (!current_user_can('export_others_personal_data')) {
wp_send_json_error(__('Sorry, you are not allowed to perform this action.'));
}
check_ajax_referer('wp-privacy-export-personal-data-' . $request_id, 'security');
// Get the request.
$request = wp_get_user_request($request_id);
if (!$request || 'export_personal_data' !== $request->action_name) {
wp_send_json_error(__('Invalid request type.'));
}
$email_address = $request->email;
if (!is_email($email_address)) {
wp_send_json_error(__('A valid email address must be given.'));
}
if (!isset($_POST['exporter'])) {
wp_send_json_error(__('Missing exporter index.'));
}
$exporter_index = (int) $_POST['exporter'];
if (!isset($_POST['page'])) {
wp_send_json_error(__('Missing page index.'));
}
$page = (int) $_POST['page'];
$send_as_email = isset($_POST['sendAsEmail']) ? 'true' === $_POST['sendAsEmail'] : false;
/**
* Filters the array of exporter callbacks.
*
* @since 4.9.6
*
* @param array $args {
* An array of callable exporters of personal data. Default empty array.
*
* @type array ...$0 {
* Array of personal data exporters.
*
* @type callable $callback Callable exporter function that accepts an
* email address and a page number and returns an
* array of name => value pairs of personal data.
* @type string $exporter_friendly_name Translated user facing friendly name for the
* exporter.
* }
* }
*/
$exporters = apply_filters('wp_privacy_personal_data_exporters', array());
if (!is_array($exporters)) {
wp_send_json_error(__('An exporter 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.'));
}
if ($exporter_index > count($exporters)) {
wp_send_json_error(__('Exporter index is out of range.'));
}
if ($page < 1) {
wp_send_json_error(__('Page index cannot be less than one.'));
}
$exporter_keys = array_keys($exporters);
$exporter_key = $exporter_keys[$exporter_index - 1];
$exporter = $exporters[$exporter_key];
if (!is_array($exporter)) {
wp_send_json_error(
/* translators: %s: Exporter array index. */
sprintf(__('Expected an array describing the exporter at index %s.'), $exporter_key)
);
}
if (!array_key_exists('exporter_friendly_name', $exporter)) {
wp_send_json_error(
/* translators: %s: Exporter array index. */
sprintf(__('Exporter array at index %s does not include a friendly name.'), $exporter_key)
);
}
$exporter_friendly_name = $exporter['exporter_friendly_name'];
if (!array_key_exists('callback', $exporter)) {
wp_send_json_error(
/* translators: %s: Exporter friendly name. */
sprintf(__('Exporter does not include a callback: %s.'), esc_html($exporter_friendly_name))
);
}
if (!is_callable($exporter['callback'])) {
wp_send_json_error(
/* translators: %s: Exporter friendly name. */
sprintf(__('Exporter callback is not a valid callback: %s.'), esc_html($exporter_friendly_name))
);
}
$callback = $exporter['callback'];
$response = call_user_func($callback, $email_address, $page);
if (is_wp_error($response)) {
wp_send_json_error($response);
}
if (!is_array($response)) {
wp_send_json_error(
/* translators: %s: Exporter friendly name. */
sprintf(__('Expected response as an array from exporter: %s.'), esc_html($exporter_friendly_name))
);
}
if (!array_key_exists('data', $response)) {
wp_send_json_error(
/* translators: %s: Exporter friendly name. */
sprintf(__('Expected data in response array from exporter: %s.'), esc_html($exporter_friendly_name))
);
}
if (!is_array($response['data'])) {
wp_send_json_error(
/* translators: %s: Exporter friendly name. */
sprintf(__('Expected data array in response array from exporter: %s.'), esc_html($exporter_friendly_name))
);
}
if (!array_key_exists('done', $response)) {
wp_send_json_error(
/* translators: %s: Exporter friendly name. */
sprintf(__('Expected done (boolean) in response array from exporter: %s.'), esc_html($exporter_friendly_name))
);
}
} else {
// No exporters, so we're done.
$exporter_key = '';
$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.6
*
* @param array $response The personal data for the given exporter and page number.
* @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 page number for this response.
* @param int $request_id The privacy request post ID associated with this request.
* @param bool $send_as_email Whether the final results of the export should be emailed to the user.
* @param string $exporter_key The key (slug) of the exporter that provided this data.
*/
$response = apply_filters('wp_privacy_personal_data_export_page', $response, $exporter_index, $email_address, $page, $request_id, $send_as_email, $exporter_key);
if (is_wp_error($response)) {
wp_send_json_error($response);
}
wp_send_json_success($response);
}