wp_user_personal_data_exporter

The timeline below displays how wordpress function wp_user_personal_data_exporter has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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&#8217;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&#8217;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&#8217;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);
}

WordPress Version: 6.1

/**
 * 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.
 */
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&#8217;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&#8217;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&#8217;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);
}

WordPress Version: 5.9

/**
 * 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.
 */
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);
    /**
     * Filter to extend 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&#8217;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&#8217;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&#8217;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);
}

WordPress Version: 5.5

/**
 * 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.
 */
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);
    /**
     * Filter to extend 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, 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&#8217;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&#8217;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&#8217;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);
}

WordPress Version: 5.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.
 */
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);
    /**
     * Filter to extend 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, 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&#8217;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&#8217;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'))) {
                        $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&#8217;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);
}

WordPress Version: 5.3

/**
 * Finds and exports personal data associated with an email address from the user and user_meta table.
 *
 * @since 4.9.6
 *
 * @param string $email_address  The users email address.
 * @return array An array of personal data.
 */
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_prop_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_prop_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);
        }
    }
    $data_to_export[] = array('group_id' => 'user', 'group_label' => __('User'), 'group_description' => __('User&#8217;s profile data.'), 'item_id' => "user-{$user->ID}", 'data' => $user_data_to_export);
    return array('data' => $data_to_export, 'done' => true);
}

WordPress Version: .10

/**
 * Finds and exports personal data associated with an email address from the user and user_meta table.
 *
 * @since 4.9.6
 *
 * @param string $email_address  The users email address.
 * @return array An array of personal data.
 */
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_prop_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_prop_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);
        }
    }
    $data_to_export[] = array('group_id' => 'user', 'group_label' => __('User'), 'item_id' => "user-{$user->ID}", 'data' => $user_data_to_export);
    return array('data' => $data_to_export, 'done' => true);
}