WordPress Version: 6.4
/**
* Finds and exports personal data associated with an email address from the user and user_meta table.
*
* @since 4.9.6
* @since 5.4.0 Added 'Community Events Location' group to the export data.
* @since 5.4.0 Added 'Session Tokens' group to the export data.
*
* @param string $email_address The user's email address.
* @return array {
* An array of personal data.
*
* @type array[] $data An array of personal data arrays.
* @type bool $done Whether the exporter is finished.
* }
*/
function wp_user_personal_data_exporter($email_address)
{
$email_address = trim($email_address);
$data_to_export = array();
$user = get_user_by('email', $email_address);
if (!$user) {
return array('data' => array(), 'done' => true);
}
$user_meta = get_user_meta($user->ID);
$user_props_to_export = array('ID' => __('User ID'), 'user_login' => __('User Login Name'), 'user_nicename' => __('User Nice Name'), 'user_email' => __('User Email'), 'user_url' => __('User URL'), 'user_registered' => __('User Registration Date'), 'display_name' => __('User Display Name'), 'nickname' => __('User Nickname'), 'first_name' => __('User First Name'), 'last_name' => __('User Last Name'), 'description' => __('User Description'));
$user_data_to_export = array();
foreach ($user_props_to_export as $key => $name) {
$value = '';
switch ($key) {
case 'ID':
case 'user_login':
case 'user_nicename':
case 'user_email':
case 'user_url':
case 'user_registered':
case 'display_name':
$value = $user->data->{$key};
break;
case 'nickname':
case 'first_name':
case 'last_name':
case 'description':
$value = $user_meta[$key][0];
break;
}
if (!empty($value)) {
$user_data_to_export[] = array('name' => $name, 'value' => $value);
}
}
// Get the list of reserved names.
$reserved_names = array_values($user_props_to_export);
/**
* Filters the user's profile data for the privacy exporter.
*
* @since 5.4.0
*
* @param array $additional_user_profile_data {
* An array of name-value pairs of additional user data items. Default empty array.
*
* @type string $name The user-facing name of an item name-value pair,e.g. 'IP Address'.
* @type string $value The user-facing value of an item data pair, e.g. '50.60.70.0'.
* }
* @param WP_User $user The user whose data is being exported.
* @param string[] $reserved_names An array of reserved names. Any item in `$additional_user_data`
* that uses one of these for its `name` will not be included in the export.
*/
$_extra_data = apply_filters('wp_privacy_additional_user_profile_data', array(), $user, $reserved_names);
if (is_array($_extra_data) && !empty($_extra_data)) {
// Remove items that use reserved names.
$extra_data = array_filter($_extra_data, static function ($item) use ($reserved_names) {
return !in_array($item['name'], $reserved_names, true);
});
if (count($extra_data) !== count($_extra_data)) {
_doing_it_wrong(__FUNCTION__, sprintf(
/* translators: %s: wp_privacy_additional_user_profile_data */
__('Filter %s returned items with reserved names.'),
'<code>wp_privacy_additional_user_profile_data</code>'
), '5.4.0');
}
if (!empty($extra_data)) {
$user_data_to_export = array_merge($user_data_to_export, $extra_data);
}
}
$data_to_export[] = array('group_id' => 'user', 'group_label' => __('User'), 'group_description' => __('User’s profile data.'), 'item_id' => "user-{$user->ID}", 'data' => $user_data_to_export);
if (isset($user_meta['community-events-location'])) {
$location = maybe_unserialize($user_meta['community-events-location'][0]);
$location_props_to_export = array('description' => __('City'), 'country' => __('Country'), 'latitude' => __('Latitude'), 'longitude' => __('Longitude'), 'ip' => __('IP'));
$location_data_to_export = array();
foreach ($location_props_to_export as $key => $name) {
if (!empty($location[$key])) {
$location_data_to_export[] = array('name' => $name, 'value' => $location[$key]);
}
}
$data_to_export[] = array('group_id' => 'community-events-location', 'group_label' => __('Community Events Location'), 'group_description' => __('User’s location data used for the Community Events in the WordPress Events and News dashboard widget.'), 'item_id' => "community-events-location-{$user->ID}", 'data' => $location_data_to_export);
}
if (isset($user_meta['session_tokens'])) {
$session_tokens = maybe_unserialize($user_meta['session_tokens'][0]);
$session_tokens_props_to_export = array('expiration' => __('Expiration'), 'ip' => __('IP'), 'ua' => __('User Agent'), 'login' => __('Last Login'));
foreach ($session_tokens as $token_key => $session_token) {
$session_tokens_data_to_export = array();
foreach ($session_tokens_props_to_export as $key => $name) {
if (!empty($session_token[$key])) {
$value = $session_token[$key];
if (in_array($key, array('expiration', 'login'), true)) {
$value = date_i18n('F d, Y H:i A', $value);
}
$session_tokens_data_to_export[] = array('name' => $name, 'value' => $value);
}
}
$data_to_export[] = array('group_id' => 'session-tokens', 'group_label' => __('Session Tokens'), 'group_description' => __('User’s Session Tokens data.'), 'item_id' => "session-tokens-{$user->ID}-{$token_key}", 'data' => $session_tokens_data_to_export);
}
}
return array('data' => $data_to_export, 'done' => true);
}