Index: src/wp-includes/default-filters.php
===================================================================
--- src/wp-includes/default-filters.php	(revision 43010)
+++ src/wp-includes/default-filters.php	(working copy)
@@ -351,6 +351,7 @@
 add_action( 'user_request_action_confirmed', '_wp_privacy_account_request_confirmed' );
 add_filter( 'user_request_action_confirmed_message', '_wp_privacy_account_request_confirmed_message', 10, 2 );
 add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_comment_personal_data_exporter' );
+add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_user_personal_data_exporter' );
 add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_comment_personal_data_eraser' );
 
 // Cron tasks
Index: src/wp-includes/user.php
===================================================================
--- src/wp-includes/user.php	(revision 43010)
+++ src/wp-includes/user.php	(working copy)
@@ -2963,7 +2963,7 @@
 	 *
 	 * @param string $description The default description.
 	 * @param string $action_name The name of the request.
-	 */	 	 	 	
+	 */
 	return apply_filters( 'user_request_action_description', $description, $action_name );
 }
 
@@ -3185,3 +3185,112 @@
 		'confirm_key_timestamp' => get_post_meta( $request_id, '_wp_user_request_confirm_key_timestamp', true ),
 	);
 }
+
+/**
+ * Registers the personal data exporter for users.
+ *
+ * @since 4.9.6
+ *
+ * @param array $exporters  An array of personal data exporters.
+ * @return array  An array of personal data exporters.
+ */
+function wp_register_user_personal_data_exporter( $exporters ) {
+	$exporters[] = array(
+		'exporter_friendly_name' => __( 'WordPress User' ),
+		'callback'               => 'wp_user_personal_data_exporter',
+	);
+
+	return $exporters;
+}
+
+/**
+ * Finds and exports personal data associated with an email address from the user and user_meta table.
+ *
+ * @since 4.9.6
+ *
+ * @param string $email_address  The users email address.
+ * @return array  An array of personal data.
+ */
+function wp_user_personal_data_exporter( $email_address ) {
+	$email_address = trim( $email_address );
+
+	$data_to_export = array();
+
+	$user = get_user_by( 'email', $email_address );
+
+	if ( ! $user ) {
+		return array(
+			'data' => array(),
+			'done' => true,
+		);
+	}
+
+	$user_meta = get_user_meta( $user->ID );
+
+	$user_prop_to_export = array(
+		'ID'              => __( 'User ID' ),
+		'user_login'      => __( 'User Login Name' ),
+		'user_nicename'   => __( 'User Nice Name' ),
+		'user_email'      => __( 'User Email' ),
+		'user_url'        => __( 'User URL' ),
+		'user_registered' => __( 'User Registered At'),
+		'user_status'     => __( 'User Status'),
+		'display_name'    => __( 'User Display Name'),
+		'nickname'        => __( 'User Nickname' ),
+		'first_name'      => __( 'User First Name' ),
+		'last_name'       => __( 'User Last Name' ),
+		'description'     => __( 'User Description' ),
+	);
+
+	$user_data_to_export = array();
+
+	foreach ( $user_prop_to_export as $key => $name ) {
+		$value = '';
+
+		switch ( $key ) {
+			case 'ID':
+			case 'user_login':
+			case 'user_nicename':
+			case 'user_email':
+			case 'user_url':
+			case 'user_registered':
+			case 'display_name':
+				$value = $user->data->$key;
+				break;
+			case 'user_status':
+				if ( '0' == $user->data->user_status ) {
+					$value = __( 'Active' );
+				} elseif ( '1' == $user->data->user_status ) {
+					$value = __( 'Inactive' );
+				} else {
+					$value = $user->data->user_status;
+				}
+				break;
+			case 'nickname':
+			case 'first_name':
+			case 'last_name':
+			case 'description':
+				$value = $user_meta[ $key ][0];
+				break;
+		}
+
+		if ( ! empty( $value ) ) {
+			$user_data_to_export[] = array(
+				'name'  => $name,
+				'value' => $value,
+			);
+		}
+	}
+
+	$data_to_export[] = array(
+		'group_id'    => 'user',
+		'group_label' => __( 'User' ),
+		'item_id'     => "user-{$user->ID}",
+		'data'        => $user_data_to_export,
+	);
+
+	return array(
+		'data' => $data_to_export,
+		'done' => true,
+	);
+}
Index: tests/phpunit/tests/user.php
===================================================================
--- tests/phpunit/tests/user.php	(revision 43010)
+++ tests/phpunit/tests/user.php	(working copy)
@@ -29,6 +29,8 @@
 				'user_email'    => 'blackburn@battlefield3.com',
 				'user_url'      => 'http://tacos.com',
 				'role'          => 'contributor',
+				'nickname'      => 'Johnny',
+				'description'   => 'I am a WordPress user that cares about privacy.',
 			)
 		);
 
@@ -1580,4 +1582,40 @@
 		// Should have the new role.
 		$this->assertSame( array( 'administrator' ), get_userdata( $editor )->roles );
 	}
+
+	/**
+	 * Testing the `wp_user_personal_data_exporter_no_user` function when no user exists.
+	 *
+	 * @ticket 43547
+	 */
+	function test_wp_user_personal_data_exporter_no_user() {
+		$actual = wp_user_personal_data_exporter( 'not-a-user-email@test.com' );
+
+		$expected = array(
+			'data' => array(),
+			'done' => true,
+		);
+
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Testing the `wp_user_personal_data_exporter_no_user` function when the requested
+	 * user exists.
+	 *
+	 * @ticket 43547
+	 */
+	function test_wp_user_personal_data_exporter() {
+		$test_user = new WP_User( self::$contrib_id );
+
+		$actual = wp_user_personal_data_exporter( $test_user->user_email );
+
+		$this->assertTrue( $actual['done'] );
+
+		// Number of exported users.
+		$this->assertSame( 1, count( $actual['data'] ) );
+
+		// Number of exported user properties.
+		$this->assertSame( 12, count( $actual['data'][0]['data'] ) );
+	}
 }
