diff --git a/wp-admin/includes/privacy-tools.php b/wp-admin/includes/privacy-tools.php index 6028cb6a3b..b547468184 100644 --- a/wp-admin/includes/privacy-tools.php +++ b/wp-admin/includes/privacy-tools.php @@ -324,42 +324,20 @@ function wp_privacy_generate_personal_data_export_file( $request_id ) { $file_basename = 'wp-personal-data-file-' . $obscura; $html_report_filename = wp_unique_filename( $exports_dir, $file_basename . '.html' ); $html_report_pathname = wp_normalize_path( $exports_dir . $html_report_filename ); - $file = fopen( $html_report_pathname, 'w' ); - if ( false === $file ) { - wp_send_json_error( __( 'Unable to open export file (HTML report) for writing.' ) ); - } + $json_report_filename = $file_basename . '.json'; + $json_report_pathname = wp_normalize_path( $exports_dir . $json_report_filename ); + /* + * Gather general data needed. + */ + + // Title. $title = sprintf( /* translators: %s: User's email address. */ __( 'Personal Data Export for %s' ), $email_address ); - // Open HTML. - fwrite( $file, "\n" ); - fwrite( $file, "\n" ); - - // Head. - fwrite( $file, "\n" ); - fwrite( $file, "\n" ); - fwrite( $file, "' ); - fwrite( $file, '' ); - fwrite( $file, esc_html( $title ) ); - fwrite( $file, '' ); - fwrite( $file, "\n" ); - - // Body. - fwrite( $file, "\n" ); - - // Heading. - fwrite( $file, '

' . esc_html__( 'Personal Data Export' ) . '

' ); - // And now, all the Groups. $groups = get_post_meta( $request_id, '_export_data_grouped', true ); @@ -394,14 +372,57 @@ function wp_privacy_generate_personal_data_export_file( $request_id ) { // Merge in the special about group. $groups = array_merge( array( 'about' => $about_group ), $groups ); + // Convert the groups to JSON format. + $groups_json = wp_json_encode( $groups ); + + /* + * Handle the JSON export. + */ + $file = fopen( $json_report_pathname, 'w' ); + + if ( false === $file ) { + wp_send_json_error( __( 'Unable to open export file (JSON report) for writing.' ) ); + } + + fwrite( $file, '{' ); + fwrite( $file, '"' . $title . '":' ); + fwrite( $file, $groups_json ); + fwrite( $file, '}' ); + fclose( $file ); + + /* + * Handle the HTML export. + */ + $file = fopen( $html_report_pathname, 'w' ); + + if ( false === $file ) { + wp_send_json_error( __( 'Unable to open export file (HTML report) for writing.' ) ); + } + + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, "' ); + fwrite( $file, '' ); + fwrite( $file, esc_html( $title ) ); + fwrite( $file, '' ); + fwrite( $file, "\n" ); + fwrite( $file, "\n" ); + fwrite( $file, '

' . esc_html__( 'Personal Data Export' ) . '

' ); + // Now, iterate over every group in $groups and have the formatter render it in HTML. foreach ( (array) $groups as $group_id => $group_data ) { fwrite( $file, wp_privacy_generate_personal_data_export_group_html( $group_data ) ); } fwrite( $file, "\n" ); - - // Close HTML. fwrite( $file, "\n" ); fclose( $file ); @@ -431,8 +452,12 @@ function wp_privacy_generate_personal_data_export_file( $request_id ) { $zip = new ZipArchive; if ( true === $zip->open( $archive_pathname, ZipArchive::CREATE ) ) { + if ( ! $zip->addFile( $json_report_pathname, 'export.json' ) ) { + $error = __( 'Unable to add data to JSON file.' ); + } + if ( ! $zip->addFile( $html_report_pathname, 'index.html' ) ) { - $error = __( 'Unable to add data to export file.' ); + $error = __( 'Unable to add data to HTML file.' ); } $zip->close(); @@ -448,13 +473,16 @@ function wp_privacy_generate_personal_data_export_file( $request_id ) { * @param string $html_report_pathname The full path to the personal data report on the filesystem. * @param int $request_id The export request ID. */ - do_action( 'wp_privacy_personal_data_export_file_created', $archive_pathname, $archive_url, $html_report_pathname, $request_id ); + do_action( 'wp_privacy_personal_data_export_file_created', $archive_pathname, $archive_url, $html_report_pathname, $request_id, $json_report_pathname ); } } else { $error = __( 'Unable to open export file (archive) for writing.' ); } - // And remove the HTML file. + // Remove the JSON file. + unlink( $json_report_pathname ); + + // Remove the HTML file. unlink( $html_report_pathname ); if ( $error ) { diff --git a/wp-includes/version.php b/wp-includes/version.php index ff8e6678f2..e57aa7922d 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.4-alpha-47145'; +$wp_version = '5.4-alpha-47146'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.