拦截个人数据导出器页面ajax响应以组装个人数据导出文件。

原型

wp_privacy_process_personal_data_export_page( array $response, int $exporter_index, string $email_address, int $page, int $request_id, bool $send_as_email, string $exporter_key )

参数

$response (array) (Required) 个人数据导出器对给定页面的响应。

$exporter_index (int) (Required) 个人数据导出器的索引。从1开始。

$email_address (string) (Required) 用户个人资料的电子邮件地址。

$page (int) (Required) 此出口商的个人数据页面。从1开始。

$request_id (int) (Required) 此个人数据导出的请求ID。

$send_as_email (bool) (Required) 是否应将导出的最终结果通过电子邮件发送给用户。

$exporter_key (string) (Required) 出口商的slu((关键)。

返回值

(array)  过滤后的响应。

源文件

路径:wp-admin/includes/file.php

<?php
...
function wp_privacy_process_personal_data_export_page( $response, $exporter_index, $email_address, $page, $request_id, $send_as_email, $exporter_key ) {
	/* Do some simple checks on the shape of the response from the exporter.
	 * If the exporter response is malformed, don't attempt to consume it - let it
	 * pass through to generate a warning to the user by default ajax processing.
	 */
	if ( ! is_array( $response ) ) {
		return $response;
	}
	if ( ! array_key_exists( 'done', $response ) ) {
		return $response;
	}
	if ( ! array_key_exists( 'data', $response ) ) {
		return $response;
	}
	if ( ! is_array( $response['data'] ) ) {
		return $response;
	}
	// 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 ID when merging exporter data.' ) );
	}
	$export_data = array();
	// First exporter, first page? Reset the report data accumulation array.
	if ( 1 === $exporter_index && 1 === $page ) {
		update_post_meta( $request_id, '_export_data_raw', $export_data );
	} else {
		$export_data = get_post_meta( $request_id, '_export_data_raw', true );
	}
	// Now, merge the data from the exporter response into the data we have accumulated already.
	$export_data = array_merge( $export_data, $response['data'] );
	update_post_meta( $request_id, '_export_data_raw', $export_data );
	// If we are not yet on the last page of the last exporter, return now.
	/** This filter is documented in wp-admin/includes/ajax-actions.php */
	$exporters = apply_filters( 'wp_privacy_personal_data_exporters', array() );
	$is_last_exporter = $exporter_index === count( $exporters );
	$exporter_done = $response['done'];
	if ( ! $is_last_exporter || ! $exporter_done ) {
		return $response;
	}
	// Last exporter, last page - let's prepare the export file.
	// First we need to re-organize the raw data hierarchically in groups and items.
	$groups = array();
	foreach ( (array) $export_data as $export_datum ) {
		$group_id    = $export_datum['group_id'];
		$group_label = $export_datum['group_label'];
		if ( ! array_key_exists( $group_id, $groups ) ) {
			$groups[ $group_id ] = array(
				'group_label' => $group_label,
				'items'       => array(),
			);
		}
		$item_id = $export_datum['item_id'];
		if ( ! array_key_exists( $item_id, $groups[ $group_id ]['items'] ) ) {
			$groups[ $group_id ]['items'][ $item_id ] = array();
		}
		$old_item_data = $groups[ $group_id ]['items'][ $item_id ];
		$merged_item_data = array_merge( $export_datum['data'], $old_item_data );
		$groups[ $group_id ]['items'][ $item_id ] = $merged_item_data;
	}
	// Then save the grouped data into the request.
	delete_post_meta( $request_id, '_export_data_raw' );
	update_post_meta( $request_id, '_export_data_grouped', $groups );
	/**
	 * Generate the export file from the collected, grouped personal data.
	 *
	 * @since 4.9.6
	 *
	 * @param int $request_id The export request ID.
	 */
	do_action( 'wp_privacy_personal_data_export_file', $request_id );
	// Clear the grouped data now that it is no longer needed.
	delete_post_meta( $request_id, '_export_data_grouped' );
	// If the destination is email, send it now.
	if ( $send_as_email ) {
		$mail_success = wp_privacy_send_personal_data_export_email( $request_id );
		if ( is_wp_error( $mail_success ) ) {
			wp_send_json_error( $mail_success->get_error_message() );
		}
	} else {
		// Modify the response to include the URL of the export file so the browser can fetch it.
		$export_file_url = get_post_meta( $request_id, '_export_file_url', true );
		if ( ! empty( $export_file_url ) ) {
			$response['url'] = $export_file_url;
		}
	}
	// Update the request to completed state.
	_wp_privacy_completed_request( $request_id );
	return $response;
}
...
?>

其他

英文文档:https://developer.wordpress.org/reference/functions/wp_privacy_process_personal_data_export_page/