wp_ajax_wp_privacy_export_personal_data

The timeline below displays how wordpress function wp_ajax_wp_privacy_export_personal_data has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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);
}

WordPress Version: 6.3

/**
 * 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 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.
     * @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 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);
}

WordPress Version: 5.5

/**
 * Ajax handler for exporting a user's personal data.
 *
 * @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 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.
     * @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 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);
}

WordPress Version: 5.4

/**
 * Ajax handler for exporting a user's personal data.
 *
 * @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 {
     *         Array of personal data exporters.
     *
     *         @type string $callback               Callable exporter function that accepts an
     *                                              email address and a page 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.
     * @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 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);
}

WordPress Version: 5.3

/**
 * Ajax handler for exporting a user's personal data.
 *
 * @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 data.
    $request = wp_get_user_request_data($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 {
     *         Array of personal data exporters.
     *
     *         @type string $callback               Callable exporter function that accepts an
     *                                              email address and a page 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.
     * @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 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);
}

WordPress Version: 5.2

/**
 * Ajax handler for exporting a user's personal data.
 *
 * @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 data.
    $request = wp_get_user_request_data($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 {
     *         Array of personal data exporters.
     *
     *         @type string $callback               Callable exporter function that accepts an
     *                                              email address and a page 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.
     * @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 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);
}

WordPress Version: .10

/**
 * Ajax handler for exporting a user's personal data.
 *
 * @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(__('Invalid request.'));
    }
    check_ajax_referer('wp-privacy-export-personal-data-' . $request_id, 'security');
    // Get the request data.
    $request = wp_get_user_request_data($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 {
     *         Array of personal data exporters.
     *
     *         @type string $callback               Callable exporter function that accepts an
     *                                              email address and a page 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 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: 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: array index */
                sprintf(__('Exporter array at index %s does not include a friendly name.'), $exporter_key)
            );
        }
        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['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['exporter_friendly_name']))
            );
        }
        $callback = $exporter['callback'];
        $exporter_friendly_name = $exporter['exporter_friendly_name'];
        $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.
     * @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 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);
}