Make WordPress Core

Ticket #43879: 43879.1.patch

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

Adds helper function from #43880 to anonymize the post_author.

  • 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        $anonymized_post['post_author'] = wp_privacy_anonymize_data( 'user_id', $post->post_author );
     6745
     6746        $post_id = (int) $post->ID;
     6747
     6748        /**
     6749         * Filters whether to anonymize the post.
     6750         *
     6751         * @since 4.9.6
     6752         *
     6753         * @param bool|string              Whether to apply the user anonymization (bool).
     6754         *                                 Custom prevention message (string). Default true.
     6755         * @param WP_Post $post            WP_Post object.
     6756         * @param array   $anonymized_post Anonymized post data.
     6757         */
     6758        $anon_message = apply_filters( 'wp_anonymize_post', true, $post, $anonymized_post );
     6759
     6760        if ( true !== $anon_message ) {
     6761            if ($anon_message && is_string ( $anon_message ) ) {
     6762                $messages = esc_html( $anon_message );
     6763            } else {
     6764                /* translators: [d: Post ID */
     6765                $messages[] = sprintf( __( 'Post %d contains personal data but could not be anonymized.'), $post_id );
     6766            }
     6767
     6768            continue;
     6769        }
     6770
     6771        $args = array(
     6772            'ID' => $post_id,
     6773        );
     6774
     6775        $updated = $wpdb->update( $wpdb->posts, $anonymized_post, $args );
     6776
     6777        if ( $updated ) {
     6778            $num_items_removed++;
     6779            clean_post_cache( $post_id );
     6780        }
     6781    }
     6782
     6783    $done = $post_query->max_num_pages <= $page;
     6784
     6785    return array(
     6786        'num_items_removed'  => $num_items_removed,
     6787        'num_items_retained' => $post_query->post_count - $num_items_removed,
     6788        'messages'           => $messages,
     6789        'done'               => $done,
     6790    );
     6791}