Skip to content

Commit 55028d6

Browse files
author
iFlair
committed
Fix: biographical info not erased during personal data erasure (#64282)
1 parent 6045c24 commit 55028d6

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

src/wp-includes/default-filters.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@
444444
add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_comment_personal_data_exporter' );
445445
add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_media_personal_data_exporter' );
446446
add_filter( 'wp_privacy_personal_data_exporters', 'wp_register_user_personal_data_exporter', 1 );
447+
add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_user_personal_data_eraser', 1 );
447448
add_filter( 'wp_privacy_personal_data_erasers', 'wp_register_comment_personal_data_eraser' );
448449
add_action( 'init', 'wp_schedule_delete_old_privacy_export_files' );
449450
add_action( 'wp_privacy_delete_old_export_files', 'wp_privacy_delete_old_export_files' );

src/wp-includes/user.php

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4165,6 +4165,101 @@ static function ( $item ) use ( $reserved_names ) {
41654165
);
41664166
}
41674167

4168+
/**
4169+
* Registers the personal data eraser for users.
4170+
*
4171+
* @since 6.7.0
4172+
*
4173+
* @param array $erasers An array of personal data erasers.
4174+
* @return array An array of personal data erasers.
4175+
*/
4176+
function wp_register_user_personal_data_eraser( $erasers ) {
4177+
$erasers['wordpress-user'] = array(
4178+
'eraser_friendly_name' => __( 'WordPress User' ),
4179+
'callback' => 'wp_user_personal_data_eraser',
4180+
);
4181+
4182+
return $erasers;
4183+
}
4184+
4185+
/**
4186+
* Erases core user profile data for a personal data erasure request.
4187+
*
4188+
* @since 6.7.0
4189+
*
4190+
* @param string $email_address The user's email address.
4191+
* @param int $page Unused. Part of the eraser signature.
4192+
* @return array {
4193+
* Data removal results.
4194+
*
4195+
* @type bool $items_removed Whether items were actually removed.
4196+
* @type bool $items_retained Whether items were retained.
4197+
* @type string[] $messages An array of messages about retained items.
4198+
* @type bool $done Whether the eraser is finished.
4199+
* }
4200+
*/
4201+
function wp_user_personal_data_eraser( $email_address, $page = 1 ) {
4202+
$response = array(
4203+
'items_removed' => false,
4204+
'items_retained' => false,
4205+
'messages' => array(),
4206+
'done' => true,
4207+
);
4208+
4209+
$email_address = trim( $email_address );
4210+
4211+
if ( empty( $email_address ) ) {
4212+
return $response;
4213+
}
4214+
4215+
$user = get_user_by( 'email', $email_address );
4216+
4217+
if ( ! $user instanceof WP_User ) {
4218+
return $response;
4219+
}
4220+
4221+
$user_id = $user->ID;
4222+
4223+
$meta_keys_to_erase = array( 'description' );
4224+
4225+
/**
4226+
* Filters the list of user meta keys removed during a personal data erasure request.
4227+
*
4228+
* @since 6.7.0
4229+
*
4230+
* @param string[] $meta_keys_to_erase User meta keys slated for deletion.
4231+
* @param WP_User $user The user whose data is being erased.
4232+
*/
4233+
$meta_keys_to_erase = apply_filters( 'wp_privacy_user_personal_data_eraser_meta_keys', $meta_keys_to_erase, $user );
4234+
4235+
foreach ( $meta_keys_to_erase as $meta_key ) {
4236+
$meta_key = sanitize_key( $meta_key );
4237+
4238+
if ( '' === $meta_key ) {
4239+
continue;
4240+
}
4241+
4242+
if ( ! metadata_exists( 'user', $user_id, $meta_key ) ) {
4243+
continue;
4244+
}
4245+
4246+
$deleted = delete_user_meta( $user_id, $meta_key );
4247+
4248+
if ( $deleted ) {
4249+
$response['items_removed'] = true;
4250+
} else {
4251+
$response['items_retained'] = true;
4252+
$response['messages'][] = sprintf(
4253+
/* translators: %s: User meta key. */
4254+
__( 'User meta "%s" could not be erased.' ),
4255+
$meta_key
4256+
);
4257+
}
4258+
}
4259+
4260+
return $response;
4261+
}
4262+
41684263
/**
41694264
* Updates log when privacy request is confirmed.
41704265
*

0 commit comments

Comments
 (0)