Make WordPress Core

Ticket #43879: 43879.patch

File 43879.patch, 4.5 KB (added by TZ Media, 7 years ago)

Anonymize posts

  • src/wp-includes/default-filters.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    352352add_filter( 'user_request_action_confirmed_message', '_wp_privacy_account_request_confirmed_message', 10, 2 );
    353353add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_comment_personal_data_exporter' );
    354354add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_comment_personal_data_eraser' );
     355add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_posts_personal_data_eraser' );
    355356
    356357// Cron tasks
    357358add_action( 'wp_scheduled_delete', 'wp_scheduled_delete' );
  • src/wp-includes/post.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    66766676
    66776677        return $clauses;
    66786678}
     6679
     6680/**
     6681 * Registers the personal data eraser for posts.
     6682 *
     6683 * @since 4.9.6
     6684 *
     6685 * @param  array $erasers An array of personal data erasers.
     6686 * @return array $erasers An array of personal data erasers.
     6687 */
     6688function wp_register_posts_personal_data_eraser( $erasers ) {
     6689    $erasers[] = array(
     6690        'erasser_friendly_name' => __( 'WordPress Posts' ),
     6691        'callback'              => 'wp_posts_personal_data_eraser',
     6692    );
     6693
     6694    return $erasers;
     6695}
     6696
     6697/**
     6698 * Erases personal data assicuated with an email address from the post.
     6699 *
     6700 * @since 4.9.6
     6701 *
     6702 * @param  string $email_address The post author email address.
     6703 * @param  int    $page          Post page.
     6704 * @return array
     6705 */
     6706function wp_posts_personal_data_eraser( $email_address, $page = 1 ) {
     6707    global $wpdb;
     6708
     6709    $user = get_user_by( 'email', $email_address );
     6710
     6711    if ( empty( $email_address ) || ! $user ) {
     6712        return array(
     6713            'num_items_removed'  => 0,
     6714            'num_items_retained' => 0,
     6715            'messages'           => array(),
     6716            'done'               => true,
     6717        );
     6718    }
     6719
     6720    // Limit us to 500 posts at a time to avoid timing out.
     6721    $number            = 500;
     6722    $page              = (int) $page;
     6723    $num_items_removed = 0;
     6724
     6725    $post_query = new WP_Query(
     6726        array(
     6727            'author'         => $user->ID,
     6728            'posts_per_page' => $number,
     6729            'paged'          => $page,
     6730            'post_type'      => array(
     6731                'post',
     6732                'page',
     6733            ),
     6734            'post_status'    => 'any',
     6735            'order_by'       => 'ID',
     6736            'order'          => 'ASC'
     6737        )
     6738    );
     6739
     6740    $messages = array();
     6741
     6742    foreach ( (array) $post_query->posts as $post ) {
     6743        $anonymized_post = array();
     6744        // TODO: Add a real anonymous user to WordPress on install or first usage.
     6745        $anonymized_post['post_author'] = 0;
     6746
     6747        $post_id = (int) $post->ID;
     6748
     6749        /**
     6750         * Filters whether to anonymize the post.
     6751         *
     6752         * @since 4.9.6
     6753         *
     6754         * @param bool|string              Whether to apply the user anonymization (bool).
     6755         *                                 Custom prevention message (string). Default true.
     6756         * @param WP_Post $post            WP_Post object.
     6757         * @param array   $anonymized_post Anonymized post data.
     6758         */
     6759        $anon_message = apply_filters( 'wp_anonymize_post', true, $post, $anonymized_post );
     6760
     6761        if ( true !== $anon_message ) {
     6762            if ($anon_message && is_string ( $anon_message ) ) {
     6763                $messages = esc_html( $anon_message );
     6764            } else {
     6765                /* translators: [d: Post ID */
     6766                $messages[] = sprintf( __( 'Post %d contains personal data but could not be anonymized.'), $post_id );
     6767            }
     6768
     6769            continue;
     6770        }
     6771
     6772        $args = array(
     6773            'ID' => $post_id,
     6774        );
     6775
     6776        $updated = $wpdb->update( $wpdb->posts, $anonymized_post, $args );
     6777
     6778        if ( $updated ) {
     6779            $num_items_removed++;
     6780            clean_post_cache( $post_id );
     6781        }
     6782    }
     6783
     6784    $done = $post_query->max_num_pages <= $page;
     6785
     6786    return array(
     6787        'num_items_removed'  => $num_items_removed,
     6788        'num_items_retained' => $post_query->post_count - $num_items_removed,
     6789        'messages'           => $messages,
     6790        'done'               => $done,
     6791    );
     6792}