Index: src/wp-includes/default-filters.php
===================================================================
--- src/wp-includes/default-filters.php	(revision 43006)
+++ src/wp-includes/default-filters.php	(working copy)
@@ -329,6 +329,7 @@
 add_action( 'do_robots', 'do_robots' );
 add_action( 'set_comment_cookies', 'wp_set_comment_cookies', 10, 3 );
 add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_comment_personal_data_exporter', 10 );
+add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_post_personal_data_exporter', 10 );
 add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_comment_personal_data_eraser', 10 );
 add_action( 'sanitize_comment_cookies', 'sanitize_comment_cookies' );
 add_action( 'admin_print_scripts', 'print_emoji_detection_script' );
Index: src/wp-includes/post.php
===================================================================
--- src/wp-includes/post.php	(revision 43006)
+++ src/wp-includes/post.php	(working copy)
@@ -6691,3 +6691,102 @@
 
 	return $clauses;
 }
+
+/**
+ * Registers the personal data exporter for posts.
+ *
+ * @param array   $exporters   An array of personal data exporters.
+ * @return array  An array of personal data exporters.
+ */
+function wp_register_post_personal_data_exporter( $exporters ) {
+	$exporters[] = array(
+		'exporter_friendly_name' => __( 'WordPress Posts' ),
+		'callback'               => 'wp_posts_personal_data_exporter',
+	);
+
+	return $exporters;
+}
+
+/**
+ * Finds and exports personal data associated with an email address from the posts table.
+ *
+ * @param string  $email_address The post author email address.
+ * @param int     $page          Post page.
+ * @return array  An array of personal data.
+ */
+function wp_posts_personal_data_exporter( $email_address, $page = 1 ) {
+	$email_address = trim( $email_address );
+
+	$number = 500;
+	$page = (int) $page;
+
+	$data_to_export = array();
+
+	$user = get_user_by( 'email' , $email_address );
+
+	if ( false === $user ) {
+		return array(
+			'data' => $data_to_export,
+			'done' => true,
+		);
+	}
+
+	$post_stati = array_diff(
+		get_post_stati(),
+		array(
+			'inherit',
+			'auto-save',
+		)
+	);
+	$registered_post_types = get_post_types( '', 'objects' );
+
+	$post_query = new WP_Query(
+		array(
+			'author'         => $user->ID,
+			'posts_per_page' => $number,
+			'paged'          => $page,
+			'post_type'      => array(
+				'post',
+				'page',
+			),
+			'post_status'    => $post_stati,
+			'orderby'        => 'ID',
+			'order'          => 'ASC',
+		)
+	);
+
+	$user_prop_to_export = array(
+		'ID'         => __( 'Post ID' ),
+		'post_title' => __( 'Post Title' ),
+		'guid'       => __( 'Post URL' ),
+	);
+
+	foreach ( (array) $post_query->posts as $post ) {
+		$post_data_to_export = array();
+
+		foreach ( $user_prop_to_export as $key => $name ) {
+			$value = $post->$key;
+
+			if ( ! empty( $value ) ) {
+				$post_data_to_export[] = array(
+					'name'  => $name,
+					'value' => $value,
+				);
+			}
+		}
+
+		$data_to_export[] = array(
+			'group_id'    => 'posts',
+			'group_label' => __( 'Posts / Pages' ),
+			'item_id'     => "post-{$post->ID}",
+			'data'        => $post_data_to_export,
+		);
+	}
+
+	$done = $post_query->max_num_pages <= $page;
+
+	return array(
+		'data' => $data_to_export,
+		'done' => $done,
+	);
+}
Index: tests/phpunit/tests/post.php
===================================================================
--- tests/phpunit/tests/post.php	(revision 43006)
+++ tests/phpunit/tests/post.php	(working copy)
@@ -1354,4 +1354,81 @@
 		$this->assertEquals( $changeset_data, json_decode( get_post( $post_id )->post_content, true ) );
 	}
 
+
+	/**
+	 * Testing the `wp_posts_personal_data_exporter()` function.
+	 *
+	 * @ticket 43440
+	 */
+	public function test_wp_posts_personal_data_exporter() {
+		$args = array(
+			'post_title'  => 'My Post',
+			'author'      => self::$editor_id,
+			'post_type'   => 'post',
+			'post_status' => 'publish',
+		);
+
+		$test_post   = self::factory()->post->create_and_get( $args );
+		$test_author = new WP_User( self::$editor_id );
+
+		$actual   = wp_posts_personal_data_exporter( $test_author->data->user_email );
+		$expected = $args;
+
+		$this->assertTrue( $actual['done'] );
+
+		// Number of exported posts.
+		$this->assertSame( 1, count( $actual['data'] ) );
+
+		// Number of exported post properties.
+		$this->assertSame( 3, count( $actual['data'][0]['data'] ) );
+
+		// Exported group.
+		$this->assertSame( 'posts', $actual['data'][0]['group_id'] );
+		$this->assertSame( 'Posts / Pages', $actual['data'][0]['group_label'] );
+
+		// Exported comment properties.
+		$this->assertSame( $test_post->ID, $actual['data'][0]['data'][0]['value'] );
+		$this->assertSame( $test_post->post_title, $actual['data'][0]['data'][1]['value'] );
+		$this->assertSame( $test_post->guid, $actual['data'][0]['data'][2]['value'] );
+	}
+
+	/**
+	 * Testing the `wp_posts_personal_data_exporter()` function for no posts found.
+	 *
+	 * @ticket 43440
+	 */
+	public function test_wp_posts_personal_data_exporter_no_posts_found() {
+		$actual = wp_posts_personal_data_exporter( 'nopostsfound@local.host' );
+
+		$expected = array(
+			'data' => array(),
+			'done' => true,
+		);
+
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Testing the `wp_posts_personal_data_exporter()` function with an empty second page.
+	 *
+	 * @ticket 43440
+	 */
+	public function test_wp_posts_personal_data_exporter_second_page() {
+		$args = array(
+			'post_title'  => 'Some Post',
+			'author'      => self::$editor_id,
+			'post_type'   => 'post',
+			'post_status' => 'publish',
+		);
+
+		$test_post   = self::factory()->post->create_and_get( $args );
+		$test_author = new WP_User( self::$editor_id );
+
+		$actual = wp_posts_personal_data_exporter( $test_author->data->user_email, 2 );
+
+		$this->assertTrue( $actual['done'] );
+
+		// Number of exported comments.
+		$this->assertSame( 0, count( $actual['data'] ) );
+	}
 }
