Index: src/wp-includes/default-filters.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/wp-includes/default-filters.php	(revision 43008)
+++ src/wp-includes/default-filters.php	(date 1524836433000)
@@ -352,6 +352,7 @@
 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_erasers', 'wp_register_comment_personal_data_eraser' );
+add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_posts_personal_data_eraser' );
 
 // Cron tasks
 add_action( 'wp_scheduled_delete', 'wp_scheduled_delete' );
Index: src/wp-includes/post.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/wp-includes/post.php	(revision 43008)
+++ src/wp-includes/post.php	(date 1524840378000)
@@ -6676,3 +6676,116 @@
 
 	return $clauses;
 }
+
+/**
+ * Registers the personal data eraser for posts.
+ *
+ * @since 4.9.6
+ *
+ * @param  array $erasers An array of personal data erasers.
+ * @return array $erasers An array of personal data erasers.
+ */
+function wp_register_posts_personal_data_eraser( $erasers ) {
+    $erasers[] = array(
+        'erasser_friendly_name' => __( 'WordPress Posts' ),
+        'callback'              => 'wp_posts_personal_data_eraser',
+    );
+
+    return $erasers;
+}
+
+/**
+ * Erases personal data assicuated with an email address from the post.
+ *
+ * @since 4.9.6
+ *
+ * @param  string $email_address The post author email address.
+ * @param  int    $page          Post page.
+ * @return array
+ */
+function wp_posts_personal_data_eraser( $email_address, $page = 1 ) {
+    global $wpdb;
+
+    $user = get_user_by( 'email', $email_address );
+
+    if ( empty( $email_address ) || ! $user ) {
+        return array(
+            'num_items_removed'  => 0,
+            'num_items_retained' => 0,
+            'messages'           => array(),
+            'done'               => true,
+        );
+    }
+
+    // Limit us to 500 posts at a time to avoid timing out.
+    $number            = 500;
+    $page              = (int) $page;
+    $num_items_removed = 0;
+
+    $post_query = new WP_Query(
+        array(
+            'author'         => $user->ID,
+            'posts_per_page' => $number,
+            'paged'          => $page,
+            'post_type'      => array(
+                'post',
+                'page',
+            ),
+            'post_status'    => 'any',
+            'order_by'       => 'ID',
+            'order'          => 'ASC'
+        )
+    );
+
+    $messages = array();
+
+    foreach ( (array) $post_query->posts as $post ) {
+        $anonymized_post = array();
+        $anonymized_post['post_author'] = wp_privacy_anonymize_data( 'user_id', $post->post_author );
+
+        $post_id = (int) $post->ID;
+
+        /**
+         * Filters whether to anonymize the post.
+         *
+         * @since 4.9.6
+         *
+         * @param bool|string              Whether to apply the user anonymization (bool).
+         *                                 Custom prevention message (string). Default true.
+         * @param WP_Post $post            WP_Post object.
+         * @param array   $anonymized_post Anonymized post data.
+         */
+        $anon_message = apply_filters( 'wp_anonymize_post', true, $post, $anonymized_post );
+
+        if ( true !== $anon_message ) {
+            if ($anon_message && is_string ( $anon_message ) ) {
+                $messages = esc_html( $anon_message );
+            } else {
+                /* translators: [d: Post ID */
+                $messages[] = sprintf( __( 'Post %d contains personal data but could not be anonymized.'), $post_id );
+            }
+
+            continue;
+        }
+
+        $args = array(
+            'ID' => $post_id,
+        );
+
+        $updated = $wpdb->update( $wpdb->posts, $anonymized_post, $args );
+
+        if ( $updated ) {
+            $num_items_removed++;
+            clean_post_cache( $post_id );
+        }
+    }
+
+    $done = $post_query->max_num_pages <= $page;
+
+    return array(
+        'num_items_removed'  => $num_items_removed,
+        'num_items_retained' => $post_query->post_count - $num_items_removed,
+        'messages'           => $messages,
+        'done'               => $done,
+    );
+}
